J2ME中文亂碼問題的原因和解決方案

          J2ME中文亂碼問題的原因和解決方案

          Java的中文問題通常會(huì)困擾很多開發(fā)者,你可能在開發(fā)Web應(yīng)用程序的時(shí)候遇到中文參數(shù)的傳遞問題,最后你可能選擇使用Filter把Request的編碼方式設(shè)置為GBK來解決。在J2ME的開發(fā)中我們同樣會(huì)遇到中文問題,比如在RMS中存儲(chǔ)中文、網(wǎng)絡(luò)傳輸中傳輸中文、從文件中讀取中文等問題。

              我們?cè)诮鉀Q中文問題的時(shí)候,用到的最多的一個(gè)詞就是UTF-8。我們知道ASCII碼是單字節(jié)編碼方式,可以解決英文的問題,但是中文的字庫非常龐大,用 ASSII碼就難以解決了。Java語言是支持UNICODE編碼方式的,UNICODE是雙字節(jié)的編碼方式可以支持中文字庫,但是這多少帶來一些浪費(fèi),因?yàn)椴⒉皇撬械?span id="wmqeeuq" class="t_tag" onclick="tagshow(event)" class="t_tag">字符串都是非英文字符的。UTF-8編碼方式正好可以解決這個(gè)問題,只有當(dāng)字符不是ASSII碼的時(shí)候他采用雙字節(jié)來表示,這樣就節(jié)省了空間。這里我只總結(jié)了三種J2ME常見的中文問題。

          1. 網(wǎng)絡(luò)傳輸中的中文問題
                    解決這個(gè)問題的關(guān)鍵是我們不采用InputStream或者OutputStream提供的方法按照字節(jié)來傳遞數(shù)據(jù),而是把InputStream或者 OutputStream封裝為DataInputStream和DataOutputStream。這樣我們就可以使用 DataOutputStream中的writeUTF(String s)來送出數(shù)據(jù)了,同時(shí)可以使用DataInputStream提供的readUTF()來讀入數(shù)據(jù)。注意在這兩個(gè)方法搭配使用的時(shí)候要注意順序。比如我們?cè)诼?lián)網(wǎng)的時(shí)候可能寫出這樣的代碼
                   
                    客戶端
          復(fù)制內(nèi)容到剪貼板
          代碼:
           dos.writeInt(myint);
          dos.writeByte(mybyte);
          dos.writeUTF(myString);
          服務(wù)器端
          復(fù)制內(nèi)容到剪貼板
          代碼:

                    int i = dis.readInt();
                    byte b = dis.readByte();
                    String s = dis.readUTF();
          2. RMS持久性存儲(chǔ)的中文問題
                    由于RMS中的數(shù)據(jù)存儲(chǔ)都是按照byte[]的格式存儲(chǔ)的,因此我們需要稍微變化一下,但是基本上還是走UTF-8的思路。
                   
                    寫入數(shù)據(jù)
          復(fù)制內(nèi)容到剪貼板
          代碼:
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          DataOutputStream dos = new DataOutputStream(baos);
          dos.writeUTF(myString);
          byte[] data = baos.toByteArray();
          rs.addRecord(data,0,data.length);
          讀出數(shù)據(jù)
          復(fù)制內(nèi)容到剪貼板
          代碼:
          byte[] data = rs.getRecord(index);
          ByteArrayInputStream bais = new ByteArrayInputStream(data);
          DataInputStream dis = new DataInputStream(bais);
          String myString = dis.readUTF();
          3. 讀取中文文件的問題
                在MIDP中并不支持文件系統(tǒng),但是我們可以讀取jar包中的文件。如果文件中含有中文,那么我們需要進(jìn)行一些特殊的處理,首先我們使用UE或者Notepad工具把相關(guān)的文件轉(zhuǎn)換文UTF-8格式編碼。我們?cè)谧x取文件的時(shí)候需要進(jìn)行如下的簡單處理。下面是處理函數(shù)。
          復(fù)制內(nèi)容到剪貼板
          代碼:
          public String readFromFile(String fileName) {
          String returnString = null;
          InputStream is = getClass().getResourceAsStream(fileName);
          if (is != null) {
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          int ch = 0;
          try {
          while ((ch = is.read()) != -1) {
          baos.write(ch);
          }
          byte[] data = baos.toByteArray();
          returnString = new String(data, "UTF-8");
          is.close();
          baos.close();
          } catch (IOException e) {
          e.printStackTrace();
          }
          }
          return returnString;
          }



          摘自

          http://www.sinojava.com/bbs/redirect.php?tid=1594&goto=lastpost

          posted on 2009-06-10 11:28 菲戈 閱讀(217) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          留言簿

          文章檔案

          相冊(cè)

          搜索

          最新評(píng)論

          主站蜘蛛池模板: 赣州市| 平和县| 临颍县| 兴隆县| 清涧县| 集安市| 泸西县| 日土县| 南投市| 巴彦淖尔市| 庄浪县| 淮北市| 柳州市| 汉寿县| 通海县| 阿尔山市| 沂南县| 卢氏县| 鸡西市| 呼和浩特市| 凤庆县| 湾仔区| 普定县| 进贤县| 伊宁县| 周至县| 上饶县| 宿松县| 商南县| 竹溪县| 合水县| 县级市| 金塔县| 河曲县| 惠州市| 黄龙县| 晋州市| 三门县| 舞阳县| 莱西市| 青州市|