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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GBK与UTF-8多次转换乱码问题,急求解!相关的知识,希望对你有一定的参考价值。

现在项目中有需求需要将字符串进行多次转码,非常郁闷的是GBK转换成ISO以后还可以转换回来,但是GBK转换成UTF-8以后回转的时候会乱码,网上看了N多的文章也没帮助解决问题,求高手们帮忙解决一下,非常感谢!!
下面是一段测试程序,public class Test
public static void main(String[] args) throws Exception
String gbk = "郁闷";
String iso = null;
String utf = null;
iso = new String(gbk.getBytes("GB2312"),"ISO-8859-1");
utf = new String(gbk.getBytes("GB2312"),"UTF-8");
System.out.println(new String(iso.getBytes("ISO-8859-1"),"GB2312"));
System.out.println(new String(utf.getBytes("UTF-8"),"GB2312"));


程序输出:
郁闷
锟斤拷
谢谢fangliangliang的回答~~ 可是我想转换GBK到UTF-8该怎样操作呢?

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;
参考技术A 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;

linux编码转换问题

一、windows下默认编码GBK。windows下编写的cpp文件默认GBK编码。代码中如果有常量字符串,字符串的编码格式跟代码文件的编码格式一致。

二、linux下默认编码是utf8。linux要把GBK编码转换成utf8编码需要使用iconv库。但是如果直接把GBK转成UTF8,会出现有些字符串能正常转换,有些转换后是乱码。正确的转换方式,先将GBK转成unicode,再将unicode转成utf8,最后未发现乱码。

以上是关于GBK与UTF-8多次转换乱码问题,急求解!的主要内容,如果未能解决你的问题,请参考以下文章

如何解决GBK转换UTF-8乱码问题

锟斤拷?UTF-8与GBK互转乱码问题

GBK与UTF-8编码错误转换后,无法再正确恢复

上传文件乱码,GBK转UTF-8

理解并解决GBK转UTF-8奇数中文乱码(转)

如何解决GBK的编码的文件中的中文转换成为UTF-8编码的文件而且不乱码