- 浏览: 316797 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a455642158:
xiajy 写道他妈的都该名字了,更可恶的金山手机助手是:sj ...
解决ADB server didn't ACK问题 -
wwt455653509:
关闭tadb.exe,重启eclipse搞定
解决ADB server didn't ACK问题 -
Frederic:
感谢,真是帮了大忙!腾讯
解决ADB server didn't ACK问题 -
xiajy:
他妈的都该名字了,更可恶的金山手机助手是:sjk_daemon ...
解决ADB server didn't ACK问题 -
xiaofeilv321:
赞同
解决ADB server didn't ACK问题
在使用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, 即为“?
中文的支持有三种编码方式:
-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请问一下,你运行时没有出现强制类型转换错误吗?
LZ请问一下,你运行时没有出现强制类型转换错误吗?
发表评论
-
RSS
2011-05-05 10:18 0RSS手机阅读 -
checkout lwuit源代码
2010-12-07 16:22 1253步骤一:安装SVN 步骤二:去 LWUIT 官网免费注册一个 ... -
wave混音的实现(2)
2010-11-11 20:43 2419关于混音算法,参考的是http://jacky-zhang.i ... -
混音算法
2010-11-11 20:41 4985一、最简单的混音算法 现在一般的软件混音算法是对输入的音频数据 ... -
wave混音的实现(1)
2010-11-11 20:36 2236先看关于wav文件的头信息 下面是封装好的一个辅助类。用于生 ... -
直接通过链接打开模拟器
2010-03-30 22:13 1068提示:需要JDK1.5 或以上支持 在jad的url之前添加 ... -
j2me优化秘密
2008-04-25 13:36 1743以下是经验总结: *只优化需要的代码 *只在有价值的地方优化 ... -
j2me图片任意角度翻转算法
2008-04-24 13:56 1301import javax.microedition.lcdui ... -
OpenBaseMovil
2008-04-17 11:05 1538http://www.openbasemovil.org/do ... -
Forum_Nokia_Technical_Library_v1_30_en(chm)
2008-04-16 16:13 1165Forum Nokia Technical Library ... -
mwt
2008-04-10 13:16 1527自己写了一个demo及一些练习 -
Different platform, different keycodes
2008-04-03 09:55 1591package opusmicro.keycode.tes ... -
floggy
2008-03-27 14:31 1333As J2ME developers we couldn't ... -
Canvas翻页效果
2008-03-26 16:01 2674仅供交流学习 -
Canvas下调用输入法
2008-03-26 15:45 2419示例程序。 -
camera support
2008-03-11 12:48 1505microedition.platform 平台名称,如j ... -
keycodes on different devices
2008-03-11 11:50 1178Device UP DOWN LEFT RIG ... -
各品牌手机键值
2008-03-11 11:48 2354原文(http://www.jum.cn/bbs/archiv ... -
A J2ME FAQ
2008-03-11 11:41 1805J2ME technologies What are the ... -
J2MEKNOWLEDGE
2008-01-24 18:46 1100example
相关推荐
**J2ME中文版教程——全面解读移动设备编程** J2ME(Java 2 Micro Edition)是Java平台的一个重要组成部分,专为嵌入式设备、移动电话和其他资源有限的设备设计。这个J2ME中文版教程是针对初学者和有一定经验的...
**J2ME中文版API**是Java Micro Edition(Java ME)平台的重要参考资料,它为开发者提供了详细的编程接口文档,帮助他们理解和使用J2ME进行移动设备和嵌入式系统的开发。J2ME作为Java技术的一个分支,专注于轻量级、...
**J2ME中文输入Demo详解** Java Micro Edition (J2ME) 是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机和平板电脑。在J2ME中,开发人员需要处理资源有限的环境,因此,提供中文输入功能是一...
**J2ME中文教程——开启手机程序开发之旅** Java 2 Micro Edition(J2ME)是Java平台的一个重要分支,专为资源有限的嵌入式设备设计,包括移动电话、智能家电、数字电视等。本教程将深入讲解J2ME在手机程序开发中的...
**J2ME中文教程概述** Java 2 Micro Edition(J2ME)是Java技术的一个重要分支,主要用于嵌入式设备和移动设备上的应用程序开发,包括手机、智能手表、数字电视等。本教程由作者sss在2006年发布,旨在帮助开发者...
在**J2ME中文API**中,主要包含以下几个核心部分: 1. **CLDC(Connected Limited Device Configuration)**:这是一个轻量级的Java虚拟机,用于资源有限的设备。它定义了运行时环境和基本类库。 2. **MIDP...
**J2ME中文教程概述** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于开发在有限资源的设备上运行的应用程序,如移动电话、智能卡、家用电器和嵌入式系统。本教程是针对中文用户设计的,旨在帮助...
### J2ME中文API的重要性 在早期的移动应用开发中,J2ME占据了主导地位,特别是在功能手机时代。中文API文档的出现,极大地便利了中国及亚洲地区的开发者,使他们能够更直观地理解J2ME的各项功能与API调用方式,...
这份"j2me 文档 开发 官方 中文"是针对J2ME开发者的重要资源,它提供了官方的中文指导,帮助开发者理解和掌握J2ME的开发技术。 J2ME由两部分组成:配置(Configurations)和框架(Profiles)。配置定义了设备的最低...
**J2ME教材:J2ME&Gaming中文版** J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能手表等。这个“J2ME&Gaming中文版”教材主要针对的是Java在游戏开发领域的...
**J2ME中文教程 MIDP2.0** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机和智能家电。MIDP(Mobile Information Device Profile)2.0是J2ME中的一个重要配置,它提供了...
### J2ME中文教程知识点概览 #### 一、J2ME简介 - **定义**:J2ME(Java 2 Platform, Micro Edition)是一种基于Java的编程平台,专为移动设备和嵌入式设备设计。它允许开发者创建能够在各种小型设备上运行的应用...
总之,这个J2ME中文开发教程结合Myeclipse插件,为开发者提供了一条便捷的学习路径,从基础知识到实战技巧,全面覆盖J2ME开发的各个方面。对于想在移动领域有所作为的程序员来说,这是一个不容错过的资源。
本文将详细解析J2ME中文API,特别是Canvas、Displayable和Alert这三个核心类的功能和使用方法。 首先,Canvas是J2ME中的一个关键类,它提供了直接在设备屏幕上进行图形绘制的能力。Canvas提供了以下几个主要方法: ...
总结,J2ME中文教程涵盖了从基础理论到实际开发的各个方面,旨在帮助开发者理解J2ME的体系结构,掌握开发技能,并能运用到实际项目中,创建高效、用户友好的移动应用程序。通过学习本教程,你将能够充分利用J2ME的...
J2ME中文版API,希望大家多多支持!我找了很久才找到的!
通过这个J2ME中文教程,学习者可以逐步掌握如何使用Java语言和J2ME平台开发手机游戏,包括创建游戏逻辑、设计用户界面、处理用户输入、管理游戏状态以及实现网络通信等关键技能。此外,教程可能还会涉及性能优化、...
J2ME教程中文版是学习J2ME编程的重要资源,涵盖了从基础概念到高级特性的全方位讲解。对于想要进入移动开发领域的Java开发者来说,理解J2ME的配置、Profile、MIDP、MIDlet、GUI、网络编程和文件系统是必不可少的步骤...
《J2ME游戏开发中文教程》是一本专为Java ME(J2ME)平台上的游戏开发而设计的详细指南。J2ME,全称为Java 2 Micro Edition,是Java技术的一个分支,主要用于移动设备和嵌入式系统的应用程序开发,包括手机、智能...