GBK与UTF-8多次转换乱码问题,急求解!

发布网友 发布时间:2022-04-24 09:43

我来回答

2个回答

热心网友 时间:2022-05-07 22:25

getBytes 的功能是将字符转换成字节数组,
gbk.getBytes("GB2312") 用GB2312翻译成字节数组,
new String(gbk.getBytes("GB2312"),"UTF-8");
把用GB2312翻译成字节数组,再用UTF-8翻译成字符串。
兄弟你想下,这里有没有问题?
这就是乱码的原因。

下面再分析下你具体的问题:
GB23121 -》ISO-8859 两个字节到一个字节
反过来,再一个字节到两个字节,不会有问题,
因为翻译时,个数不会多也不会少。

再看GBK -》UTF-8 两个字节翻译的字节数组现在要用三个字节翻译
就是说你 4个字节给人家 人家是一次要三个,出现什么情况?
拿了三个 剩下一个不够,人家就自己去添加。
你再翻译回来的时候就是 6个字节了,也说明为什么变成了三个字

提供一个转换方法:
public byte[] gbk2utf8(String chenese){
char c[] = chenese.toCharArray();
byte [] fullByte =new byte[3*c.length];
for(int i=0; i<c.length; i++){
int m = (int)c[i];
String word = Integer.toBinaryString(m);
// System.out.println(word);

StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
//补零
for(int j=0; j<len; j++){
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");

// System.out.println(sb.toString());

String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);

byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i*3] = bf[0];
bf[1] = b1;
fullByte[i*3+1] = bf[1];
bf[2] = b2;
fullByte[i*3+2] = bf[2];

}
return fullByte;
}

热心网友 时间:2022-05-07 23:43

getBytes
的功能是将字符转换成字节数组,
gbk.getBytes("GB2312")
用GB2312翻译成字节数组,
new
String(gbk.getBytes("GB2312"),"UTF-8");
把用GB2312翻译成字节数组,再用UTF-8翻译成字符串。
兄弟你想下,这里有没有问题?
这就是乱码的原因。
下面再分析下你具体的问题:
GB23121
-》ISO-8859
两个字节到一个字节
反过来,再一个字节到两个字节,不会有问题,
因为翻译时,个数不会多也不会少。
再看GBK
-》UTF-8
两个字节翻译的字节数组现在要用三个字节翻译
就是说你
4个字节给人家
人家是一次要三个,出现什么情况?
拿了三个
剩下一个不够,人家就自己去添加。
你再翻译回来的时候就是
6个字节了,也说明为什么变成了三个字
提供一个转换方法:
public
byte[]
gbk2utf8(String
chenese){
char
c[]
=
chenese.toCharArray();
byte
[]
fullByte
=new
byte[3*c.length];
for(int
i=0;
i<c.length;
i++){
int
m
=
(int)c[i];
String
word
=
Integer.toBinaryString(m);
//
System.out.println(word);
StringBuffer
sb
=
new
StringBuffer();
int
len
=
16
-
word.length();
//补零
for(int
j=0;
j<len;
j++){
sb.append("0");
}
sb.append(word);
sb.insert(0,
"1110");
sb.insert(8,
"10");
sb.insert(16,
"10");
//
System.out.println(sb.toString());
String
s1
=
sb.substring(0,
8);
String
s2
=
sb.substring(8,
16);
String
s3
=
sb.substring(16);
byte
b0
=
Integer.valueOf(s1,
2).byteValue();
byte
b1
=
Integer.valueOf(s2,
2).byteValue();
byte
b2
=
Integer.valueOf(s3,
2).byteValue();
byte[]
bf
=
new
byte[3];
bf[0]
=
b0;
fullByte[i*3]
=
bf[0];
bf[1]
=
b1;
fullByte[i*3+1]
=
bf[1];
bf[2]
=
b2;
fullByte[i*3+2]
=
bf[2];
}
return
fullByte;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com