`

截取中英文混合的字符串, 保留前面N个字符 ,抛弃被截断的汉字

 
阅读更多

备一份自己用:

/**
	 * 截取中英文混合的字符串, 保留前面的共sum个字符 ,抛弃被截断的汉字
	 * 
	 * Unicode编码,一个汉字占2个字节
	 * 
	 * UTF-8编码,一个汉字占3个字节
	 * 
	 * @param chinese_char_len
	 *            一个汉字的长度. 可选值为2和3,2表示:Unicode编码, 3表示:UTF-8编码
	 * @param str
	 *            字符串
	 * @param sum
	 *            保留字符串前面的共sum个字符, (第sum个字符被包含)
	 * 
	 * @return 截取后的字符串
	 * @throws Exception
	 *             chinese_char_len不在2和3这间时抛异常
	 */
	private static String splitChinese(final int chinese_char_len, final String str, final int sum) throws Exception
	{
		final int charset = chinese_char_len; //字符集编码
		if (charset < 2 || 3 < charset)
		{
			throw new Exception("chinese_char_len可选值为2和3,2:Unicode编码,一个汉字占2个字节, 3:UTF-8编码,一个汉字占3个字节");
		}
		int index = sum - 1; //下标比总数少一个
		if (null == str || "".equals(str))
		{
			return str;
		}
		if (index <= 0)
		{
			return str;
		}

		byte[] bt = null;
		try
		{
			if (charset == 2)
			{
				bt = str.getBytes();
			}
			else
			{
				bt = str.getBytes("UTF-8");
			}
		}
		catch (final UnsupportedEncodingException e)
		{
			e.getMessage();
		}
		if (null == bt)
		{
			return str;
		}
		if (index > bt.length - 1)
		{
			index = bt.length - 1; //防越界
		}

		//如果当前字节小于0,说明当前截取位置 有可能 将中文字符截断了
		if (bt[index] < 0)
		{
			int jsq = 0;
			int num = index;
			while (num >= 0)
			{
				if (bt[num] < 0)
				{
					jsq += 1; //计数
				}
				else
				{
					break; //循环出口
				}
				num -= 1;
			}

			int m = 0;
			if (charset == 2)
			{
				//Unicode编码
				m = jsq % 2;
				index -= m;
				//这里是重点,去掉半个汉字(有可能是半个), m为0表示无一半汉字,
				final String substrx = new String(bt, 0, index + 1); //当前被截断的中文字符整个不取	
				return substrx;
			}
			else
			{
				// utf-8 编码
				m = jsq % 3;
				index -= m;
				//这里是重点,去掉半个汉字(有可能是半个), m为0表示无一半汉字,
				String substrx = null;
				try
				{
					substrx = new String(bt, 0, index + 1, "UTF-8");
				}
				catch (final UnsupportedEncodingException e)
				{
					e.getMessage();
				} //当前被截断的中文字符整个不取	
				return substrx;
			}
		}
		else
		{
			String substrx = null;
			if (charset == 2)
			{
				//Unicode编码
				substrx = new String(bt, 0, index + 1);
				return substrx;
			}
			else
			{
				// utf-8 编码
				try
				{
					substrx = new String(bt, 0, index + 1, "UTF-8");
				}
				catch (final UnsupportedEncodingException e)
				{
					e.getMessage();
				}
				return substrx;
			}
		}
	}

 

分享到:
评论

相关推荐

    delphi 实现截取字符串中中文+英文混合截取

    在Delphi编程环境中,处理中文和英文混合的字符串截取是一项常见的任务,特别是在涉及到文本处理、数据解析或者用户界面展示时。由于Unicode编码的存在,中文字符通常占据两个字节,而英文字符则占据一个字节,这就...

    C++中英混合字符串截取

    题目中的问题聚焦于如何正确地截取一个中英混合的字符串,确保在截取过程中不会将汉字字符截断。这个问题涉及到字符编码、字符串处理以及对Unicode的理解。下面将详细解释相关知识点。 首先,我们要理解在C++中处理...

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...

    java 中字符串只中英数字混合需要分割的解决办法

    这个方法用来处理java中可能有一些特别的需要,一大串中英文混合,需要中间截断或是中英中间添加一些特别的标识,调用这个方法 第一个参数是要处理的字符串,第二个是要在中英字符中间插入的字符。调用就可以得到想...

    C#字符串截取

    根据给定的文件信息,我们可以总结出以下关于C#中的字符串截取的相关知识点: ### C#字符串截取方法概述 在C#编程语言中,字符串处理是非常常见的需求之一,尤其是在Web开发、桌面应用开发以及数据处理等领域。...

    java中英文字符串截取

    ### Java中英文字符串截取的关键点 1. **字符编码的影响**:中文字符在不同的编码方式下占用的字节数不同。例如,在UTF-8编码中,中文字符通常占用3个字节,而在GBK编码中,则可能占用2或4个字节。因此,在计算字符...

    中文字符串截取(支持各种编码格式)底层实现源码

    在IT领域,字符串处理是日常开发中的重要环节,特别是在处理包含中文字符的字符串时,由于中文字符占据的字节数量不同于英文字符,因此在截取字符串时需要考虑到不同的编码格式。本文将深入探讨中文字符串截取的底层...

    字符串截取(按字节)

    在计算机编程中,字符串处理是一项基本而关键的任务,尤其在处理非英文字符时,如何精确地按照字节进行字符串截取变得尤为重要。本文将深入探讨一种按字节截取字符串的方法,并通过分析一个具体的Java代码示例来解释...

    截取字符办法(区分中英文)

    因此,在处理这类问题时,需要一种能够区分中英文字符的方法来确保截取的准确性。 #### 正则表达式基础 在上述代码中,主要采用了正则表达式来判断字符是否为中文字符。正则表达式是一种强大的文本匹配工具,它...

    php不破坏单词截取子字符串类

    首先,这个类的核心思想是识别出字符串中的单词边界,然后根据指定长度进行截取。在英语或其他使用空格分隔单词的语言中,我们可以利用空格作为判断单词边界的依据。当截取时,如果即将截断一个完整的单词,那么就...

    PHP针对中英文混合字符串长度判断及截取方法示例

    首先,我们来看`strLength`函数,这个函数用于计算中英文混合字符串的“字符”长度。在中文环境中,一个汉字通常占用三个字节,而英文字符和大部分其他字符(如标点符号)则占用一个字节。因此,计算长度时需要区分...

    C#区分中英文按照指定长度截取字符串的方法

    本文实例讲述了C#区分中英文按照指定长度截取字符串的.../// 截取文本,区分中英文字符,中文算两个长度,英文算一个长度 /// /// 待截取的字符串 /// 需计算长度的字符串 /// &lt;returns&gt;string public static string G

    pb分割字符串,自己写的split()方法

    这些子字符串将被存储在一个数组中并最终返回。 #### 参数说明 该方法接受两个参数: 1. **as_string**:待分割的原始字符串。 2. **as_sign**:用于分割字符串的分隔符。 #### 代码实现 下面是具体的代码实现...

    php不破坏单词截取子字符串类.zip

    4. 国际化支持:考虑到可能处理多种语言的字符串,这个类库可能会考虑不同语言的单词边界问题,比如在英文中单词以空格分隔,而在中文中没有明显的单词边界,需要更复杂的算法来确定边界。 配合提供的"php中文网...

    C#中按字符串截取长字符串实例

    本文实例讲述了C#中按字符串截取长字符串的方法。分享给大家供大家参考。具体方法如下: 一般来说使用string自带的split就可以,但是split只能按char类型截取,不是很方便。 按字符串截取,使用的是正则表达式,简单...

    Golang中文字符串截取函数实现原理

    在Golang中处理字符串时,对于英文、数字等单字节字符,直接使用切片进行截取操作是安全的,但是中文字符属于多字节字符,使用UTF-8编码的情况下,一个中文字符可能由三个字节组成。因此,如果在中文字符串上直接...

    js中根据字数截取字符串,不能截断url.docx

    因此,如何在截取字符串的同时保证 URL 不被截断成为了一个重要的问题。 #### 技术实现方案 为了满足上述需求,我们可以利用 JavaScript 来实现一个功能,该功能能够按照指定的字节数来截取字符串,并且确保不会...

    以utf8格式截取的字符串编码

    在这个场景中,"以utf8格式截取的字符串编码"指的是在处理UTF-8编码的字符串时进行截取操作的方法和注意事项。 首先,我们要理解UTF-8编码的特点。UTF-8是一种变长编码,每个Unicode字符可能由1到4个字节来表示。...

    js截取固定长度的中英文字符的简单实例

    为了解决这个问题,我们需要自定义一个函数来准确地截取固定长度的字符串,同时考虑中英文字符。 标题提到的"js截取固定长度的中英文字符的简单实例",实际上就是提供了一个这样的解决方案。这个实例中的函数`...

    java按字节截取带有汉字的字符串的解法(推荐)

    在Java编程语言中,处理包含汉字的字符串时,由于汉字在不同编码格式下占用的字节数不同,按字节截取字符串会面临特殊挑战。本文将深入探讨如何正确地按字节截取带有汉字的字符串,以确保不出现半字符或者乱码的情况...

Global site tag (gtag.js) - Google Analytics