`

截取中英文混合的字符串, 保留前面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中截取带汉字的字符串

    ### 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

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

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

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

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

    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截取固定长度的中英文字符的简单实例",实际上就是提供了一个这样的解决方案。这个实例中的函数`...

Global site tag (gtag.js) - Google Analytics