4 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
你得理解new String(str.getBytes("GBK"),"UTF-8");這句話的意義,才能知道為什么會(huì)失敗。
首先,Java里的String內(nèi)部是UTF-16LE編碼的。
str.getBytes("GBK"),得到了一個(gè)Byte數(shù)組,內(nèi)容是將str的編碼轉(zhuǎn)換為GBK。
new String(str.getBytes("GBK"),"UTF-8"),則是將這個(gè)Byte數(shù)組的內(nèi)容當(dāng)作UTF-8編碼的數(shù)據(jù),轉(zhuǎn)換為String(UTF-16LE)。
明白了?這樣能行才有鬼呢。
客戶端和服務(wù)器,他們只都是Java,那么Java里的String編碼一定是UTF-16。不會(huì)受到系統(tǒng)編碼(Windows或Linux)的影響。
這種情況下最好不直接發(fā)送String,因?yàn)镾tring會(huì)被你用的庫它自動(dòng)轉(zhuǎn)換編碼(以tomcat為例,默認(rèn)iso8859-1)。
如果你可以直接發(fā)送和接收Byte數(shù)組,那么你完全可以將協(xié)議規(guī)定UTF-8。任何一方接受數(shù)據(jù)都是new String(data, "UTF-8"),發(fā)送數(shù)據(jù)都是str.getBytes("UTF-8")。
如果客戶端代碼你改不了或者用C等別的語言寫的。你確定客戶端發(fā)送的是GBK數(shù)據(jù)的話。如果你服務(wù)器能直接接收Byte數(shù)組,new String(data, "GBK"),這樣就能解析。返回的時(shí)候同樣是Byte數(shù)組str.getBytes("GBK")。
如果只能發(fā)送和接收String,那么你需要配置它,設(shè)定它轉(zhuǎn)換的編碼。比如對(duì)于tomcat,對(duì)于GET的數(shù)據(jù),需要修改web.xml,增加一個(gè)URL編碼設(shè)置項(xiàng)。對(duì)于POST數(shù)據(jù),則必須寫一個(gè)filter進(jìn)行轉(zhuǎn)換。如果是HTTP通信類,則可能提供SetEncoding之類的方法。

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果你是客戶端:
你從服務(wù)端拿到的字符串是 utf-8 編碼,你需要顯示的話,先將把字符串按照 utf-8 解碼成字節(jié)碼,然后再按照 GBK編碼。
你發(fā)送給服務(wù)端的字符串也得是 utf-8 編碼, 你需要將你的GBK編碼的字符串,解碼成字節(jié)碼,然后再按照 utf-8 編碼。
反之亦然。
之所以你看到的是亂碼,可能是你的終端的編碼問題?
String gbkStr = new String(utf8Str.getBytes("utf-8"),"gbk");
String utf8Str = new String(gbkStr.getBytes("gbk"),"utf-8");

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
添加回答
舉報(bào)