第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java 兩系統(tǒng)接口調(diào)用字符亂碼問題?

Java 兩系統(tǒng)接口調(diào)用字符亂碼問題?

搖曳的薔薇 2019-03-21 18:15:12
1.兩個(gè)系統(tǒng)間http協(xié)議接口調(diào)用,服務(wù)端系統(tǒng)編碼格式是UTF-8,客戶端系統(tǒng)是GBK,而且兩個(gè)系統(tǒng)均無法讓步讓編碼統(tǒng)一,客戶端端用的是GBK編碼傳中文,服務(wù)端怎么進(jìn)行轉(zhuǎn)換成UTF-8的,而且響應(yīng)時(shí)還要轉(zhuǎn)成GBK的?2.首先肯定不能直接通過new String(str.getBytes("GBK"),"UTF-8");把GBK轉(zhuǎn)成UTF-8,無論怎么轉(zhuǎn)都是亂的,是不是需要單獨(dú)寫工具類進(jìn)行轉(zhuǎn)碼啊?
查看完整描述

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之類的方法。


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果是網(wǎng)址的話可以使用URLEncoder/URLDecoder類


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
ITMISS

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");  


查看完整回答
反對(duì) 回復(fù) 2019-04-24
?
MM們

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊

可以通過iso8859-1編碼作為中間字符串,如果gbk直接轉(zhuǎn)utf–8時(shí),即2字節(jié)轉(zhuǎn)3字節(jié)。若是奇數(shù)個(gè)漢字,最后一個(gè)字節(jié)轉(zhuǎn)換時(shí)會(huì)計(jì)算錯(cuò)誤輸出?,還是會(huì)亂碼。


查看完整回答
反對(duì) 回復(fù) 2019-04-24
  • 4 回答
  • 0 關(guān)注
  • 1120 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)