GBK->UTF8->GBK显示不正确!

lxydesign 2006-02-13 12:03:57
我想将GBK转成UTF-8再转回GBK,

可是大部分汉字显示正确,比如,汉字、中国等都没问题,
但“国债”,显示后就是乱码。

哪位遇见过这种问题。

以下是我的测试代码:
public class Test
{
public static void main(String[] args)
{

String GBK = "国债";
String UTF8 = "";
String newGBK = "";

System.out.println("1=" + GBK);
try
{
UTF8 = new String(GBK.getBytes("UTF-8"), "GBK");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println("2=" + UTF8);

try
{
newGBK = new String(UTF8.getBytes("GBK"),"UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println("3=" + newGBK);
}
}
...全文
404 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
netpotRL 2006-02-13
  • 打赏
  • 举报
回复
输入:中国

结果:
1=中国
2=涓浗
3=中国

输入:国债

结果:
1=国债
2=鍥藉??
3=国???

输入:债债

结果:
1=债债
2=鍊哄??
3=债???

难道是“债”转成的UTF-8作为 String 的结尾时有什么特殊意义?
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
new String(GBK.getBytes("UTF-8"), "GBK");
这样的转法是错误的,搂主的概念是不对的,String 是 unicode 字符串。

推荐搂主一篇文章,相信可以让你正确的理解相关概念:
http://www.regexlab.com/zh/encoding.htm
treeroot 2006-02-13
  • 打赏
  • 举报
回复
很显然,你的默认编码不是UTF-8
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
恭喜!

希望你能了解其中的原理,这样,下次遇到问题才能够解决。
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
new InputStreamReader(new FileInputStream(file), "utf-8")

这个方法是正确的,我测试了。

非常感谢!
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
有什么问题,或者觉得我说的是不对的,可以通过 msn 跟我聊,在这里反复回复不是办法。
msn: sswater@gmail.com

理解的关键是要把 'UNICODE 字符' 与 '字节' 的概念区分。
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
sorry,刚看到

ANSI 编码
----------
GB2312,
BIG5,
Shift_JIS,

UNICODE 编码
-------------
UTF-8,
UTF-16, UnicodeBig ……
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
读取是:
new InputStreamReader(new FileInputStream(file), "utf-8")
(注意有个 utf-8)
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
"UNICODE 字符集,也分GB2312和UTF-8"
这个说法是不对的。
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
是需要转化的:
1.从我的实践来看,取出来的是
 鍥藉??
 不直接转是不行的。
2.从你推荐的文章来看
// 从字节按照 GB2312 得到 UNICODE 字符串
string = new String(bytes, "GB2312");
//UNICODE 字符集,也分GB2312和UTF-8
所以还得正确显示出来
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
String str = "国债";

之后,这个 str 与 GBK 没有任何关系。
str 中存放的内容为 2 个数字,分别是 '国' 和 '债' 在 UNICODE 字符集中的编号。
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
同样的道理:
new InputStreamReader(new FileInputStream(file), "utf-8")

得到的字符串不需要进行转化,因为 String 是 UNICODE 的。
希望你可以从我的文章中,知道其中是原理,知道为什么这样。

:)
talenty 2006-02-13
  • 打赏
  • 举报
回复
up..
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
to:sswater(光杆兵) :
我是用
new OutputStreamWriter( new FileOutputStream(file, false), "UTF-8" )
的方式存的。

可是取出来就是不知道怎么样转成正确显示的汉字
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
to:sswater(光杆兵)

1=国债
2=鍥藉??
3=国???

那么我怎么才能将
String str = "鍥藉??";
正确的显示出来?
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
sswater(光杆兵) 是说:
String GBK = "国债";
GBK本身的字符集不是“GBK”?
那么GBK(UNICODE)的字符集是指哪个?

低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
要把带汉字的数据以UTF-8的编码方式存到一个文件中,不需要进行转化,只需要:

Writer out = new OutputStreamWriter(new FileOutputStream("d:\\a.txt"), "utf-8");
out.write("中文");

就可以了,因为 String 是 UNICODE 字符串。其中的原理,欢迎参考我推荐的文章。
低调的小青蛙 2006-02-13
  • 打赏
  • 举报
回复
对于 String GBK = "国债" 来说,"将GBK转成UTF-8再转回GBK" 这种说法本身就是不对的,概念上不正确。因为:Java 中的 String 本身就是是 UNICODE 字符串,并非 byte 的多字节字符串。

对于 C++ 中的 char[] 来说,有 "字符串的编码" 这个概念,进行的操作是:
GBK 的 char[] => UNICODE 字符串 wchar_t[] => utf-8 的 char[]

因此,对于 Java 来说,String 本来就是 UNICODE 字符串,GBK 与 UTF8 之间不存在这样的转换过程:(注意,是不存在)
String(UNICODE 字符串) => 字节串 byte[] => String(UNICODE 字符串)

搂主提这个问题本身,就说明概念理解不正确。而我推荐的文章可以让你理解其中的道理:
http://www.regexlab.com/zh/encoding.htm
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
其实我的程序是要把带汉字的数据以UTF-8的编码方式存到一个文件中。

在另外的程序中把文件中的数据取出来,正确显示出来。

上面大致是我的转码方式,请高人指点。
或者可以提供一种的转码方式,能正确显示UTF-8的汉字就行
lxydesign 2006-02-13
  • 打赏
  • 举报
回复
public static void main(String[] args) {
String GBK = "国债123";
String UTF8 = "";
String GB2312 = "";

//----------- 没有转码前 -------------------
System.out.println("1=" + GBK +" \t长度:"+GBK.length());
try
{
byte [] b = GBK.getBytes("GBK");
UTF8 = new String(b, "UTF-8");
System.out.println("2=" + b +" \t长度:"+b.length);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
//----------- GBK -> UTF-8 -------------------
System.out.println("3=" + UTF8 +" \t长度:"+UTF8.length());


try
{
//正确的逻辑应该是byte [] b = UTF8.getBytes("GBK")
byte [] b = GBK.getBytes("GBK");
GB2312 = new String(b,"GB2312");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
//----------- GBK -> GB2312 -------------------
//----------- 应该是UTF-8 ->GB2312
//
System.out.println("4=" + GB2312 +" \t长度:"+GB2312.length());
}
加载更多回复(7)

62,634

社区成员

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

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