中文截取的乱码问题

Marco_Lee 2012-08-14 11:16:37
问题是这样的,一个汉字两个字节,比如现在有5个汉字的一个字符串,
代码大概是这样:

String str = "乱码的问题";
//然后转换成byte数字
byte[] byteArray = str.getBytes();
//有一个随机数i,从i开始截取这个数组
int i = 6;//随机的
byte[] byteArray2 = new byte[byteArray.length - 1];
for(int j = i; j < byteArray.length; j++) {
byteArray2[j - i] = byteArray[j];
}
String str2;
try {
str2 = new String(byteArray2, "GBK");
System.out.println("----->" + str2);//输出:----->鐨勯棶棰�����������
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}


就是这样,问题应该很清晰了吧,如果开始截取字节的位置是某个汉字对应的第二个字节,往下所有的字都乱码了,
我也没有办法判断这个 i 是否在某个汉字的中间,因为还有标点符号数字等,

我现在是想,如果出现乱码,i加1就好了,但是怎么知道是否乱码了呢?
...全文
193 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhmlwaf 2012-08-17
  • 打赏
  • 举报
回复


public class Test {

public static void main(String[] args) {


}

/**
*
* @param str 要截取的字符
* @param bytelength 截取的字节长度
* @return
*/
public static String CutString(String str,int bytelength){

String tmp = str.substring(0,6);
while(tmp.getBytes().length>bytelength){
tmp = tmp.substring(0,tmp.length()-1);
}
return tmp;
}
}

Marco_Lee 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

上面的不对,改成:
Java code

while(mMbBuf.get(i)<-30){
i++;
}
//这时候得到的i应该就是汉子的第一个字节码,一般来说汉子的第一个字节码大于-30,而后两个小于-30
//这不是官方资料,是我观察的结果,所以你要多测试


[/Quote]

好的!谢谢!我试试~~
lip009 2012-08-14
  • 打赏
  • 举报
回复
上面的不对,改成:

while(mMbBuf.get(i)<-30){
i++;
}
//这时候得到的i应该就是汉子的第一个字节码,一般来说汉子的第一个字节码大于-30,而后两个小于-30
//这不是官方资料,是我观察的结果,所以你要多测试
lip009 2012-08-14
  • 打赏
  • 举报
回复
试试这个,我没怎么测试,你最好多测测

for (j = i; j < 10 + i; j++) {
if(mMbBuf.get(j)<-30){
i++;
}
buf[j - i] = mMbBuf.get(j);
}
Marco_Lee 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

判断下byte 一个个取,别切到半个汉字就好了吧?
[/Quote]

我就是不知道怎么判断啊··~~
scbb 2012-08-14
  • 打赏
  • 举报
回复
判断下byte 一个个取,别切到半个汉字就好了吧?
Marco_Lee 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你这是要做啥啊?你这样弄,从几开始都是乱码,你把汉字的字节码都打乱了,怎么可能正确呢
[/Quote]


MappedByteBuffer mMbBuf = new RandomAccessFile(file, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, 100);

byte[] buf = new byte[10];
int i = 3;
for (j = i; j < 10 + i; j++) {
buf[j - i] = mMbBuf.get(j);
}
String s = new String(buf, "GBK");
System.out.println("----->" + s);


大致这样~~
Marco_Lee 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你这是要做啥啊?你这样弄,从几开始都是乱码,你把汉字的字节码都打乱了,怎么可能正确呢
[/Quote]

可能上面的例子不正确,其实我是在MappedByteBuffer里面取,不是String
lip009 2012-08-14
  • 打赏
  • 举报
回复
你这是要做啥啊?你这样弄,从几开始都是乱码,你把汉字的字节码都打乱了,怎么可能正确呢
lip009 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

看来不行~~ 而且即使第一个字节码是大于30~ 但是截取到的第一个字节码还可能……
[/Quote]

标点符号如果是中文的,第一个字节码应该也是大于(-30)[这里是负30]的,跟中文一样,小于-30的字节码就是中文的第二或第三个字节码。
xlhb 2012-08-14
  • 打赏
  • 举报
回复
while(mMbBuf.get(i)<-30){
i++;
}
//这时候得到的i应该就是汉子的第一个字节码,一般来说汉子的第一个字节码大于-30,而后两个小于-30
//这不是官方资料,是我观察的结果,所以你要多测试
scbb 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

判断下byte 一个个取,别切到半个汉字就好了吧?
[/Quote]
byte<=127 +1
else +2

这样不会切到半个了吧?
Marco_Lee 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

上面的不对,改成:
Java code

while(mMbBuf.get(i)<-30){
i++;
}
//这时候得到的i应该就是汉子的第一个字节码,一般来说汉子的第一个字节码大于-30,而后两个小于-30
//这不是官方资料,是我观察的结果,所以你要多测试
[/Quote]

看来不行~~ 而且即使第一个字节码是大于30~ 但是截取到的第一个字节码还可能是标点符号~~
fairjm 2012-08-14
  • 打赏
  • 举报
回复
很简单的呀 如果是乱码 byte值是负数

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧