中文在不同编码中占用的字节数是不同的,GBK编码中,一个汉字占两个字节,UTF-8编码格式中,一个汉字占3个字节。关于汉字所占字节,知乎有此问答,
http://www.zhihu.com/question/20451870。如果我们按照字节数来截取带中文的字符串,就有可能截取了半个或者三分之一个汉字,导致乱码的出现。
package com.java.string.split;
import java.util.ArrayList;
import java.util.List;
public class ChineseSplit {
public static final String chineseString = "我是testString哈哈哈";
public static void main(String[] args) {
List<String> splitStringList = chineseSplitFunction(chineseString, 5);
for (String split:splitStringList) {
System.out.println(split);
}
}
public static List<String> chineseSplitFunction(String src, int bytes){
try {
if(src == null){
return null;
}
List<String> splitList = new ArrayList<String>();
int startIndex = 0; //字符串截取起始位置
int endIndex = bytes > src.length() ? src.length() : bytes; //字符串截取结束位置
while(startIndex < src.length()){
String subString = src.substring(startIndex,endIndex);
//截取的字符串的字节长度大于需要截取的长度时,说明包含中文字符
//在GBK编码中,一个中文字符占2个字节,UTF-8编码格式,一个中文字符占3个字节。
while (subString.getBytes("GBK").length > bytes) {
--endIndex;
subString = src.substring(startIndex,endIndex);
}
splitList.add(src.substring(startIndex,endIndex));
startIndex = endIndex;
//判断结束位置时要与字符串长度比较(src.length()),之前与字符串的bytes长度比较了,导致越界异常。
endIndex = (startIndex + bytes) > src.length() ?
src.length() : startIndex+bytes ;
}
return splitList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
下面是看到的另外一种处理方式
http://www.blogjava.net/KingKong/archive/2009/09/22/296088.html
分享到:
相关推荐
在Java编程语言中,处理带有汉字的字符串时,由于汉字占据多个字节,按照字节进行截取可能会导致汉字被不完整地分割,从而产生乱码。为了解决这个问题,我们需要理解Unicode编码以及如何在Java中正确处理多字节字符...
在C#编程中,有时我们需要根据字节长度来截取字符串,这可能是因为要处理不同编码格式的数据,或者为了适应特定的传输限制。本篇将详细介绍如何在C#中按照字节长度截取字符串,并结合正则表达式进行操作。 首先,...
### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
自定义函数`FUNCTION_SF_SPLIT_STRING`如上所示,是一个典型的用于分割字符串的函数,它接受两个参数:待分割的字符串`STRING`和用作分隔符的子字符串`SUBSTRING`,返回一个`VARCHAR2`类型的数组,其中包含了分割后...
根据提供的标题、描述、标签及部分内容,我们可以总结出以下关于Java字符串处理的相关知识点: ### Java字符串处理技术:中文与英文的兼容性 在Java中,处理字符串是非常常见且重要的任务之一,尤其是在涉及到国际...
除了将记录导出到word方法外(word要把“允许西文在单词中间换行"勾上),笔者写了一个自定义函数,可将字符按用户指定的字节长度参数分割成等长字符,调用时用test(字符串,字节长度)即可,比如字符为”CSDN是个...
当使用`substr()`或`substring()`截取中文字符串时,如果截取的起始位置和长度没有正确地对齐到字符边界,就可能导致部分字符的字节被截断,从而引发乱码。这种问题在其他数据库系统中也常见,尤其是那些不支持...
本文将深入探讨如何正确地按字节截取带有汉字的字符串,以确保不出现半字符或者乱码的情况。 首先,我们需要了解的是,Java默认使用Unicode编码,它对每个字符都分配了一个唯一的16位编码,这意味着大多数汉字在...
对于包含非ASCII字符(如中文、日文等)的字符串,简单的`Substring`方法可能会导致乱码。此时,我们需要考虑字符的实际字节数量。 ```csharp public static string CutStringWithEncoding(string inputString, int...
然而,在Java中读取和写入csv文件时,中文字符如果不正确地处理,可能会出现乱码的情况。下面我们将详细介绍Java避免UTF-8的csv文件打开中文出现乱码的方法。 首先,需要了解UTF-8和UTF-16LE这两种编码格式。UTF-8...
这里需要注意的是,由于UTF-8编码可能造成字符串和字节数组的长度不一致,例如对于中文字符,“程”字在UTF-8编码下占用3个字节,因此如果截取长度不当时,最后一个字符可能无法形成一个完整的字符。 为了解决上述...
根据提供的文件信息,本文将详细解释Java中字符串的不同编码转换方法及原理,并深入探讨每种编码格式的特点。 ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理...
### JAVA中汉字字符转化为英文字符 #### 知识点概览 本文将详细介绍如何在Java中实现汉字到英文字符的转换。此技术主要用于提取汉字的首字母或进行其他基于字符编码的操作。通过以下两个核心方法:`toTureAsciiStr`...
那么一段长度为N的字符串,按照存储的ASCII码可以表示为一串如下的字符串(不包含[]) "x .. x][x .. x y x .. x][x .. x", 其中 s,e表示当前正在分析的一段子串(0, 下标e-s = 期望的分割长度cut_size) ^ ^ ^ ^ ^ 0...
《易语言分割字符串进制转换工具》是一款专为编程初学者和爱好者设计的实用软件,主要功能是将字符串按照特定规则进行分割,并进行进制之间的转换。易语言,作为中国本土化的一种编程语言,以其简单易学的特点深受...
通过上述分析,我们可以看到,按字节截取字符串并不简单,特别是当涉及到多字节字符编码时。Java代码示例提供了一个相对复杂的解决方案,通过仔细检查字节序列并确保完整字符的边界,有效地实现了这一功能。这对于...
然而,JavaScript中的字符串长度并不等同于字节长度,因为JavaScript字符串是基于Unicode编码的,每个字符可能占用1到4个字节不等。这与一些其他编程语言(如C或C++)中的字符串处理方式有所不同,在那些语言中,...
在IT行业中,字符串处理是一项基础且重要的任务,尤其是在编程领域。字符串是由字符组成的...但要注意,字节截取可能会涉及到字符编码问题,因此在实际操作时要特别留意编码格式,避免出现乱码或者截取不完整的情况。
- `split(String regex)`: 使用正则表达式分割字符串。 4. **StringBuilder与StringBuffer**: 当需要频繁修改字符串时,应使用`StringBuilder`或线程安全的`StringBuffer`,它们提供了动态增长的机制,性能优于...