`
jacky-zhang
  • 浏览: 310429 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

J2ME中文的支持问题

    博客分类:
  • j2me
阅读更多
在使用MotoJ2SDK进行J2ME应用程序的开发,经常会遇到中文的显示,存储,传输和编码的问题。首先要对388手机上开发Kjava程序时,对于中文的支持情况有所了解。
          中文的支持有三种编码方式:
          -ISO10646 and ISO8859_1 编码格式;
          -UTF8编码格式;
          -UNICODE
          下面我们来看一下各种不同的编码方式有什么区别。在目录Text下有三个.txt文件,它们是分别用ANSI、UNICODE、UTF8方式编码的一段中文,内容为“摩托罗拉”。我们用UltraEdit分别打开三个文件,并且用HEX方式浏览,可以发现:
          1. ANSI方式的16进制数据为
          C4,A6,CD,D0,C2,DE,C0,AD,
          其中每个中文占两个字节,并且每个字节都大于0xA0
          2. UNICODE方式的16进制数据为
          FF,FE,69,64,58,62,57,7F,C9,62
          其中头两个字节“FF,FE”是固定的,表示该文本按照UNICODE编码,并且随后为每个中文占两个字节。
          3. UTF8方式的16进制数据为
          EF,BB,BF,E6,91,A9,E6,89,98,E7,BD,97,E6,8B,89
          其中头3个字节“EF,BB,BF”是固定的,表示该文本按照UTF8编码,并且随后为每个中文占3个字节。

          但是,仅了解这些,对于开发有关中文的应用程序还是不够的。如何能够保证正确的传输和存储中文才是根本目的。经常有些开发者会遇到中文无法存储,以及经过网络传输后得到的是乱码的问题。这是因为,J2ME中通常是不能对中文直接进行存储和传输的,要进行一定的转换。在Hopen的J2ME论坛中,有人提到这样的方法,即用以下两个函数把字符串先转成byte 数组后在写入数据库,在读出时也要先把byte数组转换成字符串,再进行显示等操作。
          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;}
          }

          经过试验,发现这是一种简单有效的方法,并且同样使用于UDP传输中文数据,即再传输前先转换成byte数组,接收后把byte数组再转换成字符串显示。在目录UTFTest中,我做了一个简单的实例。UTFSendTest.java中,通过TextBox输入一段要传输的中文,
          String strText=mainScreen.getString();
          然后定义一个byte数组,
          byte[] bText = new byte[100];
          然后把要发送的字符串利用前面的函数转换成byte数组,以便进行传输
          bText = string2byte(strText);
          int length = bText.length;
          最后把转换后的byte数组数据发送到Server端,
          dc = (DatagramConnection)Connector.open(destAddr);
          Datagram dobject = dc.newDatagram(bText,length,destAddr);
          dc.send(dobject);
          在Server端的UTFTest.java中做一个逆过程即可,
          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);

          现在似乎有了一个权宜之计,至少可以进行有关中文的操做了。但是有关中文的问题还没有彻底的说清楚。还有一个经常提到的问题,就是为什么不能象显示英文一样,用System.out.println(strReceive); 来显示一段中文字符串变量呢?这一点对于本来就不直观的调试界面来说也是十分必要的,开发者要经常通过这种方式来验证中文是否读取和传输正确。而实际上,我们看到的只是一串无奈的“???”。因此在MotoJ2SDK中,直接用
          System.out.println ("中文");
          或者是,String testString = new String("中华人民共和国");
          System.out.println(testString);
          通常是不可行的。如何才能保证在模拟器界面和system.out中都能正确显示中文呢?下面我们以finalUDP目录中的UDPServer和UDPClient为例来分析一下。
          如果采用上面的方法,利用函数byte2string()和 string2byte(),在进行传输之前都转换成Byte数组的格式,用 UTF8的编码方式,可以得到正常的传输,Client端发出“发送摩托罗拉”,Server端收到后发出“返回摩托罗拉”,Client端接收到后显示在模拟器手机屏幕上,但是发送和接收中文字符串用System.out.println()时,都是“???”。
          下面对程序做如下改动,Server端受到“发送摩托罗拉”后,要发出“返回摩托罗拉”。但是这次不采用
          static final String replyMsg=”返回摩托罗拉”;
          byte[] bText = new byte[100];
          bText = string2byte(replyMsg);
          而是分别用bText =replyMsg.getBytes();
          或 bText =replyMsg.getBytes("ISO10646");
          或 bText =replyMsg.getBytes("ISO8859_1");
          把待发字符串转换成字符数组,在Client端接收时不用以前的方式:
          dc.receive(dobject);
          bReceive = dobject.getData();
          receiveMsg = byte2string(bReceive,0,bReceive.length);
          而是直接采用
          dc.receive(receiveData);
          receiveMsg = new String(receiveData.getData(),0,receiveData.getLength());
          然后再把接收到字符串显示输出,为了细致分析接受到的字符数组每个元素的值,用如下方式读出并显示:
          bReceive=receiveMsg.getBytes();
          for(int i=0;i<bReceive.length;i++)
          System.out.println("rcv"+i+":"+bReceive[i]);
          经过试验,bText =replyMsg.getBytes();三种不同的参数情况,试验结果如下表所示:



          参数情况 接收到的数组 元素情况 接收端模拟器 屏幕显示情况 接收端system.out 显示情况
          Void 共12个bytes,每个汉字对应2个bytes,
          并且值即为各自ANSI编码值,例如“返”对应0xB7,0xB5  乱码 正常
          "ISO10646" Java.io.unSupportedEncodingException:ISO10646    
          "ISO8859_1" 共6个元素,每个均为0x3F, 即为“?
分享到:
评论
1 楼 llyer110 2008-10-06  
dc = (DatagramConnection)Connector.open(destAddr);

LZ请问一下,你运行时没有出现强制类型转换错误吗?

相关推荐

    j2me api 中文完整版

    J2ME中文版API,希望大家多多支持!我找了很久才找到的!

    J2ME 中文教程

    第六章“GAME API” 介绍了MIDP 2.0相对于1.0来说,最大的变化——新添加的用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。游戏API包提供了一系列针对无线设备的游戏开发类。你可以开发你的游戏...

    J2ME 中文教程1.01a

    第六章“GAME API” 介绍了MIDP 2.0相对于1.0来说,最大的变化——新添加的用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。游戏API包提供了一系列针对无线设备的游戏开发类。你可以开发你的游戏...

    J2ME中文教程

    第九章“MIDP 2.0 Push 技术”介绍了如何通过异步方式将信息传送给设备并自动启动J2ME 中文教程 by www.j2medev.comMIDlet 程序的机制。 第十章“MIDlet 的开发流程与部署”介绍了如何真正完成你的程序并打包发往...

    Eclipse开发J2ME之最佳插件-EclipseMe1.5.0

    EclipseME插件的最新版本,用Eclipse开发J2ME的最佳搭档! 1.5.0版对设备管理部分进行了大刀阔斧的重构,配置更加方便,对各厂商无线工具包的支持更加灵活。 EclipseME的英文文档已全部翻译成中文,并获得作者...

    J2ME模拟器_win绿色版

    这是一个非常好用的windows版的java手机模拟器; 可直接运行javaME的.jar文件程序,模拟手机按键运行; 怀旧java手机游戏,直接运行jar游戏和程序! 已经汉化,支持中文显示;

    J2ME中文手机游戏中文地图编辑器

    每一个手机游戏开发者都要拥有一个这样的东西,希望大家喜欢分数现在只要1分、大家支持我,我会分享更多好的程序 Demo给大家参考

    KEmulator v1.0 绿色中文版 PC 平台上强大的手机 J2ME(java)模拟器.zip

    KEmulator 1.0 绿色中文版是目前最为强大的手机J2ME(java)游戏或软件的模拟器, 你可以在电脑上直接运行众多的 JAVA 游戏。KEmulator 1.0 就是这样一个模拟器,它不仅有着速度快,稳定,使用方便等特点,更有许多...

    DreamBook 1.0.0 (rar格式)

    运行平台:支持j2me的手机。 特点:可以读取gb2312、utf-8、unicode编码的Txt文档,并且对文件大小无限制,对每个文件阅读位置有记忆功能。 注意:如果您在csdn上没有积分,可以直接通过下面联系方式向我索要该软件...

    j2mepolish中文文档

    J2ME-Polish是一个德国人开发的开源项目,它提供了对j2me一整套的支持。比如支持自定义UI,支持国际化,通过build.xml生成对各个厂商的手机等。其中最有特色的是采用css定制UI,使得界面呈现和代码分离。

    MSN手机客户端1.1.6

    国际化支持(当前支持的语言有简体中文、繁体中文和英文) &lt;br&gt;注意: &lt;br&gt;由于使用了socket连接,对于中国移动的用户,本软件只支持'cmnet'连接方式,因此当系统询问连接方式的时候,请用户务必使用访问点为...

    UnicodeReader

    该文本阅读器是利用j2me开发出来的符合MIDP2.0标准的应用程序,它可以在所有支持midp2.0,jsr75的手机上运行。 1.局限性 目前该阅读器仅支持unicode编码格式的文本文件。我正在努力将其扩展到支持gb2312(简体中文)...

    SDL Passolo 2011 合作版 SP9 (11.9.0.53) 已注册中文版

    * Java 资源 (所有平台 J2EE, J2SE 和 J2ME) 属性文件,源文件,二进制文件,方案文件 * Palm 操作系统软件 * ODBC 数据库解析器 支持 ACCESS, Excel, SQL 服务器, Oracle, MySQL, IBM DB2 * Visual BASIC 6 二进制...

    2011最新J2EE官网教程(中文)

    目前,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition,J2SE)、适用于...

    手机模拟器KEmulator(电脑上玩手机游戏) v1.0 中文绿色版.zip

    kemulator 一款模拟运行手机j2me(java)游戏或软件的模拟器,例如下载游戏后可以先用 kemulator 试试看好玩不,再安装到手机上,或者闲得无聊想在电脑上玩手机游戏 o(╯□╰)o kemulator 对大部分的 java游戏支持很...

    嵌入式系统/ARM技术中的WinCE设计开发常见问题的解决以及开发特性及忠告

    在智能手机领域被大多数手机厂商支持的J2ME无疑是领头羊,微软CE平台的SmartPhone也逐渐成为关注焦点。一直不温不火的PDA市场,也在行业应用领域有所收获,Pocket PC由于其开发与Windows平台的一致性而得到了开发...

    MOTO_TXT_1.0.zip

    阅读繁体中文的文本文件时,请将文本文件的编码更改为UNICODE,MOTO-TXT就可以完美的支持了!!! 常见问题解答: 安装MOTO-TXT后看不见文件列表?答:如果你的是motorola的手机,那就是你没有进行java软件访问...

    WinCE设计开发常见问题的解决以及开发特性及忠告

    在智能手机领域被大多数手机厂商支持的J2ME无疑是领头羊,微软CE平台的SmartPhone也逐渐成为关注焦点。一直不温不火的PDA市场,也在行业应用领域有所收获,Pocket PC由于其开发与Windows平台的一致性而得到了开发...

Global site tag (gtag.js) - Google Analytics