选择显示字体大小

手机中文码制问题的一点理解

论坛上很多的帖子都是在讨论手机上的中文码制问题,我也曾经被此类的问题所困扰,并且得到了不少热心的朋友的帮助。通过一端时间的资料查找和测试学习,我对这个问题有一点点自己的理解和想法,不敢敝帚自珍,特分享给大家,由于本人水平有限,况且也是业余的开发爱好者,没有专业的理论学习水平,所以请大家就文章中的一些错误予以谅解并提出批评,本篇的文章仅做抛砖引玉,非常的欢迎大家的跟贴,我们群策群力,共同来解决这个问题。:)

论坛上很多的帖子都是在讨论手机上的中文码制问题,我也曾经被此类的问题所困扰,并且得到了不少热心的朋友的帮助。通过一端时间的资料查找和测试学习,我对这个问题有一点点自己的理解和想法,不敢敝帚自珍,特分享给大家,由于本人水平有限,况且也是业余的开发爱好者,没有专业的理论学习水平,所以请大家就文章中的一些错误予以谅解并提出批评,本篇的文章仅做抛砖引玉,非常的欢迎大家的跟贴,我们群策群力,共同来解决这个问题。:)

手机里面的字符串基本上都是采用的utf-8的编码法。
而我们在pc机器上所采用的基本上都是ascii和unicode编码法
ascii编码法是单字节的编码方法,只能表示256个字符,英文字母是足够了
但是无法表示汉字
unicode是双字节的编码法,可以用来表示汉字,但是却对于一般的英文字母浪费了太多的空间(至少面对于手机的存储是这样的)。
utf-8就是专门手机这种嵌入式设备的新的编码法,他的特点是,传统的ascii字符还是以一个字节来表示的,但是如果字符不属于ascii字符集时,就用两至三个位来表示。
在 0x0001-0x007f之间的字符(传统的ascii字符)用一个位来表示
0 bits0-6
在 0x000以及在0x0080-0x07ff之间的字符使用下面来表示:
1 1 0 bits 6-10 1 0 bits 0-5
如果虚拟机看到这样的一个字符的话,虚拟机会把第一个字节最前头的110以及第二个字节的前头的10拿掉把剩下的位重新组合成一个2字节的数位来表示字符:
00000 bits 6-10 bits 0-5
同理,0x0800 - 0xffff的字符表示:
1 1 1 0 bits 12-15 1 0 bits 6-11 1 0 bits 0-5
也可以用同样的方法重新组合成一个两个字节的字符串来
特别需要注意的是kjava中的null字符也使用两个字节来表示而不是一个字节:)

当然英文字符串在utf-8编码法中不会出什么问题(默认为标准的acsii编码机制)主要的问题还是中文,我个人在kjava的手机开发中中文字符串所碰到的问题主要分为以下几类:
1.rms数据库读写的问题;
2.在jad中书写游戏中文名称;
3.网络传输中中文问题(kxml传输的解码);
4.部分的模拟器也不支持中文.
这几个部分是在手机开发中,中文经常出错的险区,通常的表现形式是乱码:)

1.了解到了utf-8码的基本原理就非常的有利于我们解决码制转化的问题
在转化utf-8码中我处理的方法是这样的

//向数据库中写入中文
string appt3 = "中文字符";
bytearrayoutputstream bos = new bytearrayoutputstream();
dataoutputstream dos = new dataoutputstream(bos);
dos.writeutf(appt3);
byte[] bytes3 = bos.tobytearray();
rs.addrecord(bytes3, 0, bytes3.length);

//从数据库中读出中文
byte b3[] = rs.getrecord(dbid);
datainputstream dis=new datainputstream(new bytearrayinputstream(b3));
string chinastring = dis.readutf();

writeutf() 和 readutf() 分别是dataoutputstream 和 datainputstream对象的的方法,他们提供了一个由从unicode到utf-8的相互转化的途径。
仔细看看midp的说明文档,可以看到以下内容
writeutf() :
first, two bytes are written to the output stream as if by the writeshort method giving the number of bytes to follow. this value is the number of bytes actually written out, not the length of the string. following the length, each character of the string is output, in sequence, using the utf-8 encoding for the character.if no exception is thrown, the counter written is incremented by the total number of bytes written to the output stream. this will be at least two plus the length of str, and at most two plus thrice the length of str.

当然我们也可以自己来手工的编写代码,把中文字符串转化成byte[]再放入rms,取出时转成string即可。
这里借用bingo_guan的方法(bingo_guan,请不要介意呀 :)),当然了这段代码也非常的设计模式化 :) hehe,这个类也可用于文本文件操作。

[1] [2] [3]  下一页


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons