Posted on 2012-01-14 16:16
在路上... 閱讀(331)
評(píng)論(0) 編輯 收藏
碰到中文亂碼的時(shí)候,可以考慮使用一個(gè)熟悉的中心字符串入手進(jìn)行調(diào)試跟蹤轉(zhuǎn)換過(guò)程的變化,這里記錄一下“中文”漢字的編碼變化過(guò)程
UNICODE編碼:4e2d 6587
通常在JAVA的內(nèi)置處理機(jī)制中是這樣存儲(chǔ)的,不同的環(huán)境中返回的byte[]不一樣,例如windows環(huán)境,使用getBytes()返回的是getBytes(“GBK”),linux環(huán)境,通常如果設(shè)置LANG=zh_CN.UTF-8,這相當(dāng)于getBytes(“utf-8”).
GBK編碼:d6d0 cec4,byte[]={-42,-48,-50,-60}
UTF8編碼:e4 b8 ad e6 96 87,byte[]={-28,-72,-83,-26,-106,-121}
ISO8859-1編碼:如果試圖將byte[]={-42,-48,-50,-60}采用new String(byte[],”iso8859-1”)讀取,由于不能正確轉(zhuǎn)換,所以是2個(gè)問(wèn)號(hào)byte[]={63,63}
但是從存儲(chǔ)的角度看,gbk和iso8859-1有類(lèi)似之處,GBK采用char(2),而iso8859-1采用byte[4],拆分為{-42,-48,-50,-60}
Javascript:可以使用var str=”\u4E2D\u6587”;來(lái)表示
HTML中,可以使用中文,相當(dāng)于吧16進(jìn)制轉(zhuǎn)換為10進(jìn)制,再加上轉(zhuǎn)義控制&#和;結(jié)尾。
如果需要從utf byte[]和GBK byte[]之間互相轉(zhuǎn)換,在支持unicode的java平臺(tái),可以使用下面的轉(zhuǎn)換規(guī)則
byte[] utf8={-28,-72,-83,-26,-106,-121};
String str=new String(utf8,”utf-8”);//轉(zhuǎn)換為正確的中文
byte[] gbk=str.getBytes(“GBK”);
或者:
byte[] gbk={-42,-48,-50,-60};
String str=new String(utf8,"GBK");//轉(zhuǎn)換為正確的中文
byte[] utf8=str.getBytes("utf-8")
注意上面的byte[]為java的,與.net不一樣,需要轉(zhuǎn)換