<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冰浪

    哥已不再年輕 - 堅(jiān)定夢(mèng)想,畢生追求!
    posts - 85, comments - 90, trackbacks - 0, articles - 3
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    J2ME中文的支持問(wèn)題

    Posted on 2009-04-09 09:22 冰浪 閱讀(181) 評(píng)論(0)  編輯  收藏 所屬分類: J2ME
              在使用MotoJ2SDK進(jìn)行J2ME應(yīng)用程序的開(kāi)發(fā),經(jīng)常會(huì)遇到中文的顯示,存儲(chǔ),傳輸和編碼的問(wèn)題。首先要對(duì)388手機(jī)上開(kāi)發(fā)Kjava程序時(shí),對(duì)于中文的支持情況有所了解。
              中文的支持有三種編碼方式:
              -ISO10646 and ISO8859_1 編碼格式;
              -UTF8編碼格式;
              -UNICODE
              下面我們來(lái)看一下各種不同的編碼方式有什么區(qū)別。在目錄Text下有三個(gè).txt文件,它們是分別用ANSI、UNICODE、UTF8方式編碼的一段中文,內(nèi)容為“摩托羅拉”。我們用UltraEdit分別打開(kāi)三個(gè)文件,并且用HEX方式瀏覽,可以發(fā)現(xiàn):
              1. ANSI方式的16進(jìn)制數(shù)據(jù)為
              C4,A6,CD,D0,C2,DE,C0,AD,
              其中每個(gè)中文占兩個(gè)字節(jié),并且每個(gè)字節(jié)都大于0xA0
              2. UNICODE方式的16進(jìn)制數(shù)據(jù)為
              FF,F(xiàn)E,69,64,58,62,57,7F,C9,62
              其中頭兩個(gè)字節(jié)“FF,F(xiàn)E”是固定的,表示該文本按照UNICODE編碼,并且隨后為每個(gè)中文占兩個(gè)字節(jié)。
              3. UTF8方式的16進(jìn)制數(shù)據(jù)為
              EF,BB,BF,E6,91,A9,E6,89,98,E7,BD,97,E6,8B,89
              其中頭3個(gè)字節(jié)“EF,BB,BF”是固定的,表示該文本按照UTF8編碼,并且隨后為每個(gè)中文占3個(gè)字節(jié)。

              但是,僅了解這些,對(duì)于開(kāi)發(fā)有關(guān)中文的應(yīng)用程序還是不夠的。如何能夠保證正確的傳輸和存儲(chǔ)中文才是根本目的。經(jīng)常有些開(kāi)發(fā)者會(huì)遇到中文無(wú)法存儲(chǔ),以及經(jīng)過(guò)網(wǎng)絡(luò)傳輸后得到的是亂碼的問(wèn)題。這是因?yàn)椋琂2ME中通常是不能對(duì)中文直接進(jìn)行存儲(chǔ)和傳輸?shù)模M(jìn)行一定的轉(zhuǎn)換。在Hopen的J2ME論壇中,有人提到這樣的方法,即用以下兩個(gè)函數(shù)把字符串先轉(zhuǎn)成byte 數(shù)組后在寫入數(shù)據(jù)庫(kù),在讀出時(shí)也要先把byte數(shù)組轉(zhuǎn)換成字符串,再進(jìn)行顯示等操作。
              public static String byte2string(byte[] b,int offset,int len )
              {
              try{
              ByteArrayInputStream bais = new ByteArrayInputStream(b,offset,len);
              DataInputStream inputstream = new DataInputStream( bais );
              return inputstream.readUTF();
              }catch(IOException e){return null;}
              }
              public static byte[] string2byte(String s)
              {
              try{
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              DataOutputStream outputstream = new DataOutputStream(baos);
              outputstream.writeUTF( s );
              return baos.toByteArray();
              }catch(IOException e){return null;}
              }

              經(jīng)過(guò)試驗(yàn),發(fā)現(xiàn)這是一種簡(jiǎn)單有效的方法,并且同樣使用于UDP傳輸中文數(shù)據(jù),即再傳輸前先轉(zhuǎn)換成byte數(shù)組,接收后把byte數(shù)組再轉(zhuǎn)換成字符串顯示。在目錄UTFTest中,我做了一個(gè)簡(jiǎn)單的實(shí)例。UTFSendTest.java中,通過(guò)TextBox輸入一段要傳輸?shù)闹形模?
              String strText=mainScreen.getString();
              然后定義一個(gè)byte數(shù)組,
              byte[] bText = new byte[100];
              然后把要發(fā)送的字符串利用前面的函數(shù)轉(zhuǎn)換成byte數(shù)組,以便進(jìn)行傳輸
              bText = string2byte(strText);
              int length = bText.length;
              最后把轉(zhuǎn)換后的byte數(shù)組數(shù)據(jù)發(fā)送到Server端,
              dc = (DatagramConnection)Connector.open(destAddr);
              Datagram dobject = dc.newDatagram(bText,length,destAddr);
              dc.send(dobject);
              在Server端的UTFTest.java中做一個(gè)逆過(guò)程即可,
              dc = (DatagramConnection)Connector.open("datagram://:"+ port);
              Datagram dobject;
              byte[] bReceive = new byte[100];
              dobject = dc.newDatagram(dc.getMaximumLength());
              dc.receive(dobject);
              bReceive = dobject.getData();
              String strReceive = byte2string(bReceive,0,bReceive.length);
              mainScreen.setString("已收到:"+strReceive);

              現(xiàn)在似乎有了一個(gè)權(quán)宜之計(jì),至少可以進(jìn)行有關(guān)中文的操做了。但是有關(guān)中文的問(wèn)題還沒(méi)有徹底的說(shuō)清楚。還有一個(gè)經(jīng)常提到的問(wèn)題,就是為什么不能象顯示英文一樣,用System.out.println(strReceive); 來(lái)顯示一段中文字符串變量呢?這一點(diǎn)對(duì)于本來(lái)就不直觀的調(diào)試界面來(lái)說(shuō)也是十分必要的,開(kāi)發(fā)者要經(jīng)常通過(guò)這種方式來(lái)驗(yàn)證中文是否讀取和傳輸正確。而實(shí)際上,我們看到的只是一串無(wú)奈的“???”。因此在MotoJ2SDK中,直接用
              System.out.println ("中文");
              或者是,String testString = new String("中華人民共和國(guó)");
              System.out.println(testString);
              通常是不可行的。如何才能保證在模擬器界面和system.out中都能正確顯示中文呢?下面我們以finalUDP目錄中的UDPServer和UDPClient為例來(lái)分析一下。
              如果采用上面的方法,利用函數(shù)byte2string()和 string2byte(),在進(jìn)行傳輸之前都轉(zhuǎn)換成Byte數(shù)組的格式,用 UTF8的編碼方式,可以得到正常的傳輸,Client端發(fā)出“發(fā)送摩托羅拉”,Server端收到后發(fā)出“返回摩托羅拉”,Client端接收到后顯示在模擬器手機(jī)屏幕上,但是發(fā)送和接收中文字符串用System.out.println()時(shí),都是“???”。
              下面對(duì)程序做如下改動(dòng),Server端受到“發(fā)送摩托羅拉”后,要發(fā)出“返回摩托羅拉”。但是這次不采用
              static final String replyMsg=”返回摩托羅拉”;
              byte[] bText = new byte[100];
              bText = string2byte(replyMsg);
              而是分別用bText =replyMsg.getBytes();
              或 bText =replyMsg.getBytes("ISO10646");
              或 bText =replyMsg.getBytes("ISO8859_1");
              把待發(fā)字符串轉(zhuǎn)換成字符數(shù)組,在Client端接收時(shí)不用以前的方式:
              dc.receive(dobject);
              bReceive = dobject.getData();
              receiveMsg = byte2string(bReceive,0,bReceive.length);
              而是直接采用
              dc.receive(receiveData);
              receiveMsg = new String(receiveData.getData(),0,receiveData.getLength());
              然后再把接收到字符串顯示輸出,為了細(xì)致分析接受到的字符數(shù)組每個(gè)元素的值,用如下方式讀出并顯示:
              bReceive=receiveMsg.getBytes();
              for(int i=0;i<bReceive.length;i++)
              System.out.println("rcv"+i+":"+bReceive[i]);
              經(jīng)過(guò)試驗(yàn),bText =replyMsg.getBytes();三種不同的參數(shù)情況,試驗(yàn)結(jié)果如下表所示:



              參數(shù)情況 接收到的數(shù)組 元素情況 接收端模擬器 屏幕顯示情況 接收端system.out 顯示情況
              Void 共12個(gè)bytes,每個(gè)漢字對(duì)應(yīng)2個(gè)bytes,
              并且值即為各自ANSI編碼值,例如“返”對(duì)應(yīng)0xB7,0xB5  亂碼 正常
              "ISO10646" Java.io.unSupportedEncodingException:ISO10646    
              "ISO8859_1" 共6個(gè)元素,每個(gè)均為0x3F, 即為“?

    (轉(zhuǎn)于http://jacky-zhang.javaeye.com/blog/148245)
    主站蜘蛛池模板: 国产福利免费视频| 国产精品V亚洲精品V日韩精品| 在线观看免费视频网站色| 亚洲中文字幕久久精品无码VA| 国产精一品亚洲二区在线播放| 日本一道一区二区免费看| 18禁无遮挡无码国产免费网站| 中文字幕视频免费在线观看| 猫咪www免费人成网站| 亚洲第一综合天堂另类专| 亚洲国产精品成人综合久久久| 亚洲av无码成人黄网站在线观看| 亚洲色欲久久久久综合网| 国产传媒在线观看视频免费观看| 德国女人一级毛片免费| 久久久久久国产a免费观看黄色大片 | 亚洲一线产品二线产品| 亚洲视频在线观看地址| 亚洲AV色香蕉一区二区| 亚洲大尺度无码无码专区| 久久久久噜噜噜亚洲熟女综合| 又粗又硬又大又爽免费视频播放| 日韩特黄特色大片免费视频| 免费观看的av毛片的网站| 成人午夜大片免费7777| 在线观看视频免费国语| 大学生美女毛片免费视频| 午夜免费不卡毛片完整版| 在线免费观看色片| 日本一线a视频免费观看| 国产精品麻豆免费版| 日日AV拍夜夜添久久免费| 在线观看亚洲免费视频| 四虎永久免费地址在线网站| 亚洲成人影院在线观看| 亚洲高清免费视频| 国产亚洲视频在线播放| 久久精品国产亚洲夜色AV网站| 久久国产亚洲电影天堂| 激情内射亚洲一区二区三区| 亚洲国产成人久久综合一区|