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

现在项目中有需求需要将字符串进行多次转码,非常郁闷的是GBK转换成ISO以后还可以转换回来,但是GBK转换成UTF-8以后回转的时候会乱码,网上看了N多的文章也没帮助解决... 现在项目中有需求需要将字符串进行多次转码,非常郁闷的是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该怎样操作呢?
展开
 我来答
fangliangliang
推荐于2016-01-08 · TA获得超过1624个赞
知道小有建树答主
回答量:767
采纳率:0%
帮助的人:652万
展开全部
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;
}
大雅新科技有限公司
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,... 点击进入详情页
本回答由大雅新科技有限公司提供
全友恽畅畅
2019-07-06 · TA获得超过3742个赞
知道大有可为答主
回答量:3199
采纳率:34%
帮助的人:499万
展开全部
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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式