j2me與.net WebService傳輸中文亂碼解決方法
自己站里一篇舊文http://www.591pic.com
左腳耐克,右腳阿迪達(dá),記得在哪聽(tīng)過(guò)這句話。
現(xiàn)在是左手N70,右手N95。
三月份做的那個(gè)移動(dòng)物流項(xiàng)目進(jìn)入收尾,突然要增加終端定位功能,在專(zhuān)用GPS設(shè)備上開(kāi)發(fā)已經(jīng)來(lái)不及了,公司決
定在手機(jī)終端上開(kāi)發(fā)。就這樣,帶GPS模塊的機(jī)皇N95就屈尊到了我手里,小爽了一把。
正事歸正事,在原有模塊上做了一周多,碰到一個(gè)奇怪的問(wèn)題。終端獲取GPS定位信息后,需要周期性上傳至服務(wù)
器,終端是通過(guò)JSR172來(lái)調(diào)用服務(wù)端的WEBSERVICE,當(dāng)傳入的參數(shù)為中文時(shí),服務(wù)器數(shù)據(jù)庫(kù)中記錄的數(shù)據(jù)就為
亂碼,當(dāng)參數(shù)為英文或阿拉伯?dāng)?shù)字時(shí),就正常(廢話:英文都成亂碼,那計(jì)算機(jī)不是瘋了?!呵呵)
初步判斷是由于終端和服務(wù)端碼制不同造成的。
比如:public String sendMessage(String message) 有一個(gè)這樣的方法。
當(dāng)傳入?yún)?shù)message為中文時(shí),服務(wù)器端接收到的就是亂碼,但該方法卻能正常返回中文
查詢到的手機(jī)系統(tǒng)編碼是:iso-8859-1,服務(wù)器端的編碼方式為UTF-8。
嘗試過(guò)在手機(jī)端將字符串用iso-8859-1打成字節(jié)數(shù)組,然后用UTF-8組成新字符串,
如: message=new String(message.getBytes("iso-8859-1"),"UTF-8"); 服務(wù)器端收到的也一樣是亂碼。
在將iso8859-1,utf-8,gbk這三種編解碼排列組合的試過(guò)一次后,仍然還是亂碼。
一天過(guò)去了,
google之,文檔查詢之,“牛人”咨詢之,求神拜佛之,頭撞南墻之, 啥沒(méi)解決之。
翌日上班,看了一會(huì)前一天的代碼,做了結(jié)論:今天估計(jì)要接著撞墻,于是繼續(xù)。
接近中午,正撞得過(guò)癮,突然,一同事失手掉落茶杯,清脆的聲音和散落的碎片一下轉(zhuǎn)移了我的注意力。對(duì),就是
打碎!腦子里的燈泡一亮(呵呵,此處純屬蒙太奇效果)。打碎不就行了嗎?
在手機(jī)端將一個(gè)字符串按UTF-8打成字節(jié)數(shù)組,傳到服務(wù)器端,然后在服務(wù)器端將同樣的字符串按UTF-8打成字節(jié)數(shù)
組,兩者比較找差別。
比如:在手機(jī)端將“中文測(cè)試”按UTF-8打成字節(jié)數(shù)組,在服務(wù)器上也將“中文測(cè)試”按UTF-8打成字節(jié)數(shù)組,兩者
肯定不同,因?yàn)橐粯拥脑捑筒淮嬖趤y碼問(wèn)題了。
經(jīng)過(guò)在多種情況下(中文,英文,數(shù)字,特殊符號(hào))對(duì)比兩個(gè)字節(jié)數(shù)組,發(fā)現(xiàn)如下不同:
中文或特殊字符(不在ASCII范圍內(nèi)): j2me端的字節(jié)數(shù)組與服務(wù)器端.net環(huán)境下的字節(jié)數(shù)組,每一個(gè)字節(jié)都相差25
6。 英文或數(shù)字(在ASCII范圍內(nèi)): 一個(gè)字符就是一個(gè)字節(jié), j2me端與.net服務(wù)器端值一樣。
規(guī)律出來(lái)了,剩下的事情就是砍瓜切菜,想怎么來(lái)就怎么來(lái):
終端在發(fā)送前,將待發(fā)送字符串中的字符挨個(gè)取出,按UTF-8打成字節(jié)數(shù)組,當(dāng)字節(jié)數(shù)組的長(zhǎng)度大于一時(shí),當(dāng)前字
符即為漢字或特殊字符,則每個(gè)字節(jié)的值不變;如果字符被打成字節(jié)數(shù)組的長(zhǎng)度等于一,則為ASCII范圍內(nèi)字符,字
節(jié)值減去256。
.netWEB服務(wù)端:將接收到的字節(jié)數(shù)組,挨個(gè)增加256,然后按“UTF-8”組成字符串即可。
奮戰(zhàn)到12點(diǎn)半,終于完成了編寫(xiě),測(cè)試:我在終端傳進(jìn)“帥哥”,服務(wù)端數(shù)據(jù)庫(kù)里新增記錄顯示“lostsky_11”,BINGAL
O!亂碼問(wèn)題解決!(呵呵 別倒!其實(shí)是傳入“我愛(ài)北京天安門(mén)”,數(shù)據(jù)庫(kù)里也如實(shí)記錄,沒(méi)有亂碼)
解決了問(wèn)題,回頭就該追究原因了,分析如下:
1,java里的byte范圍為-128~127, .net中byte的范圍為0~255;
2,utf-8處理ASCII范圍內(nèi)字符用一個(gè)字節(jié)表示,中文等時(shí)用大于一個(gè)字節(jié)表示,造成“字符不等長(zhǎng)”。
在習(xí)慣了調(diào)用現(xiàn)成方法編碼解碼之后,面對(duì)突然變化的情況,人很容易被慣性推進(jìn)迷茫。只有 退,思,辨才能洞見(jiàn)本質(zhì),細(xì)微處入手,所謂“以無(wú)間入有間”。
群木難舟 一葦渡江 善哉
posted on 2009-06-10 12:04 菲戈 閱讀(877) 評(píng)論(1) 編輯 收藏