日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

idhttp返回乱码_HTTP客户端POST方式中文编码(乱码)解决方案(转)

發(fā)布時(shí)間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 idhttp返回乱码_HTTP客户端POST方式中文编码(乱码)解决方案(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這段時(shí)間,在給一個(gè)地區(qū)門(mén)戶網(wǎng)站(alexa全球排行1200左右)做SSO集成,其中的一個(gè)部分就是Web Services服務(wù)接口,以及客戶端,我們采用的是REST方式,不是SOAP,大致就是客戶端通過(guò)HTTP POST方式向服務(wù)器提交數(shù)據(jù),如賬號(hào)同步,服務(wù)器返回xml,給客戶端反饋。但提交過(guò)程中中文問(wèn)題出來(lái)了,因?yàn)橘~號(hào)中有個(gè)realName字段是中文。客戶端有以下幾種:

1、Java HTTP客戶端(HttpURLConnection)

2、PHP客戶端(curl庫(kù))

3、ajax 客戶端(XMLHTTP)

4、普通表單提交(POST方式)

…..

開(kāi)發(fā)上面四種客戶端API和 demo都很快,現(xiàn)在就記錄一下中文解決方案問(wèn)題吧。

我之所以要發(fā)表出來(lái),是因?yàn)槲疫@兒的解決方式是自動(dòng)化的,編碼量最小,并且我進(jìn)行了無(wú)數(shù)次嘗試,確定怎樣行,怎樣不行,并找出原因。

注意:我只是說(shuō)明了request的中文解決方案,并且只是POST方式,但只要是對(duì)這個(gè)很理解,response的中文也就很簡(jiǎn)單了。

開(kāi)始時(shí)候,我也是采用了比較機(jī)械的,在服務(wù)器端servlet中將得到的參數(shù)值:

Java代碼

byte[]?b?=?value.getBytes("ISO-8859-1");

output?=?new?String(b,"UTF-8");

這樣可以解決問(wèn)題,而且都成功了,但必須在四種客戶端發(fā)送的中文時(shí)候要進(jìn)行encoding操作。最后我覺(jué)得這肯定不是最優(yōu)解,因?yàn)楣ぷ髁刻?#xff0c;于是決定重構(gòu)。

將發(fā)往服務(wù)器的request都用filter攔截,主要就是下面這句話,其實(shí)這個(gè)方式非常old了,不值得一提。在doFilter里:

Java代碼

request.setCharacterEncoding(encoding);

也就是將到來(lái)的所有請(qǐng)求(還沒(méi)有說(shuō)到response呢)都用指定的編碼(UTF-8)進(jìn)行編碼。

用filter,可以解決服務(wù)器移植的問(wèn)題,如我最熟悉的Tomcat,resin,WL,WS。

我用axis (著名的Web Services SOAP引擎)附帶的TCPMonitor來(lái)探測(cè)發(fā)出的POST請(qǐng)求。

Java HTTP客戶端(HttpURLConnection):

必須將請(qǐng)求數(shù)據(jù)的key/value的value,進(jìn)行編碼:

Java代碼

URLEncoder.encode(value,"UTF-8")

;

PHP客戶端(curl庫(kù)):

同上,必須進(jìn)行轉(zhuǎn)碼:

Java代碼

$truename?=?iconv("GBK",?"UTF-8","陳志武");

因?yàn)槲覀働HP默認(rèn)環(huán)境是中文

ajax客戶端:

發(fā)送POST請(qǐng)求時(shí),直接用中文,不需要用Javascript的encodeURI(),或者escape(),但是用了也不影響。

why?因?yàn)閍jax POST方式默認(rèn)是以UTF-8方式發(fā)送的。對(duì)已經(jīng)編碼的中文,也就是一些%E9%99%88%E5%BF%97%E6%AD%A6這樣的正常符號(hào)了,服務(wù)器就忽略編碼了,因?yàn)榫幒筒痪幰粋€(gè)樣。

注意,這兩個(gè)函數(shù)對(duì)中文encode后結(jié)果不一樣。用encodeURI()是以UTF-8編碼,但沒(méi)有其它編碼類型可選擇,這樣,如果你的服務(wù)器端的filter用GBK默認(rèn),那么,就不能象這樣自動(dòng)處理。

所以,用ajax客戶端時(shí),必須慎重點(diǎn)。

普通表單提交(POST方式)

如果希望自動(dòng)解決問(wèn)題,在filter里對(duì)request請(qǐng)求編碼設(shè)置為UTF-8的前提下,最好就是加入如下:

Java代碼

"Content-Type"?content="text/html;?charset=UTF-8"?/>

如果charset為GBK,那么到Server端就是亂碼的。

why?因?yàn)?#xff0c;用submit方式提交時(shí),我們的提交的表單編碼類型(enctype)是:

Content-Type: application/x-www-form-urlencoded,也就是說(shuō),提交的時(shí)候,我們的中文會(huì)自動(dòng)進(jìn)行編碼,但依據(jù)就是上面的那個(gè)html指令。這個(gè)證據(jù)可以從TCPMonitor攔截的HTTP數(shù)據(jù)包里看到。

和上面的方式比較,ajax方式感覺(jué)是瀏覽器為我們建立了一個(gè)http通道,直接將中文提交上去了,和最前面介紹的兩種一樣。

在服務(wù)器端,我們的Java Web容器或應(yīng)用服務(wù)器會(huì)自動(dòng)給我們的request參數(shù)解碼。將編碼后的字符還原為本來(lái)面目。

如果你在控制臺(tái)里面看到的都是正確的中文,你就可以拋開(kāi)數(shù)據(jù)庫(kù)這個(gè)存在編碼問(wèn)題了,但那個(gè)有時(shí)也有點(diǎn)麻煩

總結(jié)

以上是生活随笔為你收集整理的idhttp返回乱码_HTTP客户端POST方式中文编码(乱码)解决方案(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。