我想将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);
}
}
但“国债”,显示后就是乱码。哪位遇见过这种问题。以下是我的测试代码:
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);
}
}
这样的转法是错误的,搂主的概念是不对的,String 是 unicode 字符串。推荐搂主一篇文章,相信可以让你正确的理解相关概念:
http://www.regexlab.com/zh/encoding.htm
1=中国
2=涓浗
3=中国输入:国债结果:
1=国债
2=鍥藉??
3=国???输入:债债结果:
1=债债
2=鍊哄??
3=债???难道是“债”转成的UTF-8作为 String 的结尾时有什么特殊意义?
bytes = str.getBytes(code)表示取得str的已code编码方式编码的字节数组
str = new String(bytes,code)表示将bytes字节数组转换为字符串,bytes的编码必须与code匹配
输入:中国结果:
1=中国
2=涓浗
3=中国输入:国债结果:
1=国债
2=鍥藉??
3=国???输入:债债结果:
1=债债
2=鍊哄??
3=债???所以
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();
}
System.out.println("3=" + UTF8 +" \t长度:"+UTF8.length()); try
{
byte [] b = GBK.getBytes("GBK");
GB2312 = new String(b,"GB2312");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println("4=" + GB2312 +" \t长度:"+GB2312.length());
}结果是:1=国债123 长度:5
2=[B@35ce36 长度:7
3=???123 长度:6
4=国债123 长度:5谁能解释一下??
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());
}
或者可以提供一种的转码方式,能正确显示UTF-8的汉字就行
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
out.write("中文");就可以了,因为 String 是 UNICODE 字符串。其中的原理,欢迎参考我推荐的文章。
String GBK = "国债";
GBK本身的字符集不是“GBK”?
那么GBK(UNICODE)的字符集是指哪个?
2=鍥藉??
3=国???那么我怎么才能将
String str = "鍥藉??";
正确的显示出来?
我是用
new OutputStreamWriter( new FileOutputStream(file, false), "UTF-8" )
的方式存的。可是取出来就是不知道怎么样转成正确显示的汉字
new InputStreamReader(new FileInputStream(file), "utf-8")得到的字符串不需要进行转化,因为 String 是 UNICODE 的。
希望你可以从我的文章中,知道其中是原理,知道为什么这样。:)
str 中存放的内容为 2 个数字,分别是 '国' 和 '债' 在 UNICODE 字符集中的编号。
1.从我的实践来看,取出来的是
鍥藉??
不直接转是不行的。
2.从你推荐的文章来看
// 从字节按照 GB2312 得到 UNICODE 字符串
string = new String(bytes, "GB2312");
//UNICODE 字符集,也分GB2312和UTF-8
所以还得正确显示出来
这个说法是不对的。
new InputStreamReader(new FileInputStream(file), "utf-8")
(注意有个 utf-8)
----------
GB2312,
BIG5,
Shift_JIS,UNICODE 编码
-------------
UTF-8,
UTF-16, UnicodeBig ……
msn: [email protected]理解的关键是要把 'UNICODE 字符' 与 '字节' 的概念区分。