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)  編輯  收藏

          評(píng)論

          # re: j2me與.net WebService傳輸中文亂碼解決方法[未登錄](méi) 2012-01-30 10:43 leo

          我感覺(jué)程序員都是神經(jīng)病!  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          留言簿

          文章檔案

          相冊(cè)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 霍城县| 湖南省| 开远市| 常德市| 安多县| 长乐市| 菏泽市| 铁岭市| 盘山县| 苍南县| 闵行区| 晋城| 昌黎县| 五峰| 东城区| 渭南市| 萨迦县| 余干县| 巴林右旗| 尚志市| 革吉县| 辉县市| 磐石市| 遂宁市| 蓬莱市| 云林县| 乐安县| 额敏县| 溧阳市| 定结县| 余干县| 谢通门县| 桦南县| 濮阳市| 宁乡县| 遵义市| 沾益县| 泽普县| 高雄市| 西城区| 连南|