Motorola J2ME SDK对中文的支持

转载 2006年05月23日 19:23:00

Motorola J2ME SDK对中文的支持

相信看过RUN!PC 11月号的文章「利用Java 撰写PalmOS应用程序基础篇」的读者,在撰写PalmOS上的Spotlet时一定会遇到中文无法正常显示的问题。中文的问题分成两个部分,一个是在使用者接口上的中文问题,一个是在命令列输出(利用System.out.println()函式所做的输出)上的中文问题,请大家做个小实验,将前面我们所撰写的程序改如下:

HelloMIDlet.java

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet

{

private Display firstDisplay ;

private Form firstForm ;

HelloMIDlet()

{

firstDisplay = Display.getDisplay(this) ;

firstForm = new Form("哈啰!MIDlet") ;

StringItem firstStrItem = new StringItem("哈啰","米德列特") ;

firstForm.append(firstStrItem) ;

System.out.println("MIDlet激活") ;

}

protected void startApp() throws MIDletStateChangeException

{

firstDisplay.setCurrent(firstForm) ;

}

protected void pauseApp()

{

}

protected void destroyApp(boolean unconditional)

throws MIDletStateChangeException

{

}

}

将本MIDlet编译并经过预身审核之后,我们开启仿真器来执行此MIDlet,底下为执行结果:

使用者接口输出

命令列输出

 

 

 

 

 

 

我们从结果发现,预设的编译指令会让使用者接口正常输出中文,而命令列无法输出正确的中文。

接着请将compileAll.bat之中原本的指令:javac -O -bootclasspath ../../lib %COMPILECLASS%

修改为:javac -encoding ISO8859_1 -O -bootclasspath ../../lib %COMPILECLASS%

之后,重新编译此MIDlet执行结果:

使用者接口输出

命令列输出

 

 

 

 

 

 

我们从结果发现,预设的编译指令会让使用者接口无法正常输出中文,而命令列却可以输出正确的中文。

这个结果与PalmOS上所做的中文测试结果有所不同。

当您撰写Spotlet时,如果您使用 javac 。。。指令时,您会发现仿真器上的使用者接口输出是乱码,可是命令列上的输出却可以正常输出中文。但是如果您使用的是javac -encoding ISO8859_1 。。。指令,则CLDC内附仿真器上的使用者接口输出或是命令列上的输出全部都变成乱码,无法正常输出中文(这个部分是因为CLDC内附仿真器实做的问题,造成与实际机器的结果有差)。

总之,如果之前您所撰写的Spotlet无法在装有中文系统的实体机器或POSE上正常输出中文,请您也如法炮制,在编译指令中加入 -encoding ISO8859_1 ,就可以在实体机器或POSE上看到正常的中文字了。

会产生此问题的主因,主要是因为编译好的Java类别档(byte code)之中,所有的文字编码都采用UTF8。举例来说,当您在程序代码里用到"激活"这两个中文字时,

"起"这个字的Big5编码为B1D2。

"动"这个字的Big5编码为B0CA。

我们会使用javac xxxx.java来编译原始码以产生类别档。其实这行指令,在繁体中文的Windows环境底下,相当于javac -encoding "Big5" xxxx.java。也就是说,当编译器读取到Big5编码范围的中文字时,会自动将此Big5码经过「Big5 e Unicode 对照表」将Big5转为Unicode,也就是说,经过查表之后,

"起"这个字的Unicode编码为555F。

"动"这个字的Unicode编码为5272。

然后再利用UTF8编码将此Unicode转为UTF8,储存在类别档之中,因此,如果您用UltraEdit之类的文字编辑器查看类别文件时,您会看到,

"起"这个字的UTF8编码为E5959F。

"动"这个字的UTF8编码为E58B95。

接着,当我们在程序执行时如果要将中文输出,则JVM会负责读进UTF8码,然后将其转回Unicode,最后依据您所使用的作业环境预设的编码转回Big5,再输出至屏幕上。

可是经过测试结果,KVM似乎只有做到把UTF8读进来,转换回Unicode之后就直接输出了。少了转回Big5的步骤,因此,操作系统把Unicode当作Big5来处理,自然就找不到该码所对应的中文字了,也因此输出的是一堆 ????? 的符号。这也是我们在PalmOS上即使装了中文系统,也无法正常显示中文的缘故。

OK,既然知道KVM只帮我们做了一半的工作,那事情就好办了,我们只要让UTF8转回之后,仍然保有Big5的编码方式即可,于使我们使用指令 javac -encoding ISO8859_1 xxxx.java,请编译器不要将程序代码中中文Big5编码的两个byte视为一体(因为视为一体就会引发查询Big5 --> Unicode对照表的工作),只要将中文当作是普通的西欧字母字集即可,因此,当我们使用了上述指令,您会发现类别档之中的中文变成,

"起"这个字的UTF8编码为C2B1 C392。

"动"这个字的UTF8编码为C2B0 C38A。

大家可以发现编译器把B1、D2、B0、CA个别当作一个码来处理。于是,当KVM读到此编码时,就会将他们转回B1D2以及B0CA,然后KVM直接输出,就可以正常地使用中文了。

最后总结整个问题,就笔者的推断,CLDC内附的仿真器再没有使用 javac -encoding ISO8859_1 xxxx.java 指令之前,会在使用者接口会是命令列输出乱码,这才是正常的结果, 而Motorola J2ME SDK内附仿真器的使用者接口中文之所以没问题,很可能只是因为仿真器在实做的差异。因此以KVM的输出结果来看,很可能在实际的手机上,我们都必须加上 -encoding ISO8859_1 选项才能正确输出中文吧!

在此特别感谢静宜大学资管系的唐恺隆(kailung.tang@msa.hinet.net)同学。因为笔者与他经过热烈的讨论之后,我们才能对J2ME的中文问题有更深入的认识。

7步教你使用ItellijIDEA 5.0 编写J2ME程序

题外话【本文可以转载, 但是必须包含链接:http://blog.csdn.net/oldjavaman  】一直以来,我都使用IntellijIDEA作为Java的IDE,不是不喜欢JBuilder...
  • oldjavaman
  • oldjavaman
  • 2006年07月28日 21:02
  • 1588

Eclipse上搭建Nokia手机的J2ME开发环境

-->安装Nokia Development Suite 2.2 最新版本的Nokia开发包为2.2版本,支持J2ME2.0(包括1.0)。下载地址:http://www.forum.nokia.c...
  • herrapfel
  • herrapfel
  • 2005年06月24日 16:58
  • 1812

最新版idea2017+kemulator搭建J2ME开发环境

要求32位电脑,没有的话装个虚拟机。实际中发现kemulator的调试功能只有在32位条件下才能运行...
  • songhaibei7305
  • songhaibei7305
  • 2017年06月26日 17:35
  • 484

整合SE J2ME SDK与eclipse开发环境

SonyEricsson提供的J2ME SDK非常好用,它的发布形式和SUN提供的WTK基本一样。因此非常容易和其他的集成开发环境整合到一起,SE提供的文档中介绍了如何把SE J2ME SDK和sun...
  • wri1982
  • wri1982
  • 2005年05月20日 14:39
  • 970

MOTOROLA的j2me站点

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月22日 01:17
  • 162

J2ME中文教程之J2ME技术概述

随着移动通信的突飞猛进,移动开发这个新鲜的字眼慢慢成为开发者关注的热点。在网上进行的最近一份调查显示,有24.34%的受访者涉足嵌入式/移动设备应用开发,这个数字可能略高于实际的比例,但也足可说明嵌入...
  • lpy123456
  • lpy123456
  • 2007年01月16日 12:37
  • 676

J2ME中文的支持问题

在使用MotoJ2SDK进行J2ME应用程序的开发,经常会遇到中文的显示,存储,传输和编码的问题。首先要对388手机上开发Kjava程序时,对于中文的支持情况有所了解。中文的支持有三种编码方式:-IS...
  • blade2001
  • blade2001
  • 2010年02月26日 12:55
  • 337

eclipse中配置j2me,简单运行j2me程序

1.安装好jdk2.去官网上下载好eclipse,去eclipseme.org上下载eclipseme,http://www.oracle.com/technetwork/java/download-...
  • snrqtdhuqf
  • snrqtdhuqf
  • 2011年01月20日 10:09
  • 2388

用Eclipse做J2Me开发的前期配置

 我也是一个初学者,从一个初学者的角度上讲,就是要尽可能的详细,因为这个东西稍微配置不对,或者是那里没有注意到,就会走不少的弯路,所以我在这里把配置讲得非常的详细,以图文的形式展示,以免你看了不知道所...
  • fenglibing
  • fenglibing
  • 2007年09月05日 23:01
  • 10305

Intel与Motorola的编码格式

Vector CANdb++ Online Help 在这份教程的第一部分,我们提到没有CAN数据库,CANoe还不能工作。在第二部分,我们来看看CAN数据库是怎样的。通过CANoe的Too...
  • fz835304205
  • fz835304205
  • 2017年11月06日 16:54
  • 643
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Motorola J2ME SDK对中文的支持
举报原因:
原因补充:

(最多只允许输入30个字)