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

上传人:宝路 文档编号:2984556 上传时间:2017-07-29 格式:DOC 页数:14 大小:45.01KB
返回 下载 相关 举报
手机中文码制问题的一点理解_第1页
第1页 / 共14页
手机中文码制问题的一点理解_第2页
第2页 / 共14页
手机中文码制问题的一点理解_第3页
第3页 / 共14页
手机中文码制问题的一点理解_第4页
第4页 / 共14页
手机中文码制问题的一点理解_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《手机中文码制问题的一点理解》由会员分享,可在线阅读,更多相关《手机中文码制问题的一点理解(14页珍藏版)》请在金锄头文库上搜索。

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

2、法,只能表示 256 个字符,英文字母是足够了,但是无法表示汉字。unicode 是双字节的编码法,可以用来表示汉字,但是却对于一般的英文字母浪费了太多的空间(至少面对于手机的存储是这样的)。UTF-8 就是专门手机这种嵌入式设备的新的编码法,他的特点是,传统的 ASCII 字符还是以一个字节来表示的,但是如果字符不属于ASCII 字符集时,就用两至三个位来表示。在 0x0001-0x007F 之间的字符(传统的 ASCII 字符)用一个位来表示0 | bits0-6在 0x000 以及在 0x0080-0x07FF 之间的字符使用下面来表示:1 | 1 | 0 | bits 6-10 | 1

3、 | 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 编码

4、法中不会出什么问题( 默认为标准的ACSII 编码机制) 主要的问题还是中文 ,我个人在 Kjava 的手机开发中中文字符串所碰到的问题主要分为以下几类:1.rms 数据库读写的问题;2.在 jad 中书写游戏中文名称 ;3.网络传输中中文问题(kxml 传输的解码);4.部分的模拟器也不支持中文.这几个部分是在手机开发中,中文綺常出错的险区, 通常的表现形式是乱码1.了解到了 UTF-8 码的基本訽理就非常的有利于我们解决码制转化的问题在转化 UTF-8 码中我处理的方法是这样的/向数据库中写入中文String appt3 = 中文字符; ByteArrayOutputStream bos

5、= 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 =

6、 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

7、 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. Th

8、is 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,这个类也可用于文本文件操作。/* Title: * Description: unicode 字串转换工具* Copyright: Copyright (c) 2003*

9、Company: CC Studio* author Bingo* version 1.0*/public class UnicodeStringpublic UnicodeString()public static String byteArrayToString(byte abyte0, int i)StringBuffer stringbuffer = new StringBuffer();for(int j = 0; j 8);return abyte0;2.其次,在 jad 和 manifest 中的中文字(比如说游戏的名字)实际上也都是 UTF-8 编码,这一块也是綺常出问题的险区

10、,我建议还是自己手工转化成 UTF-8 的编码写在上面,否则的话,如果你用unicode 码制写入中文的话,在模拟器或者实际设备上就有无法识别而导致程序不能执行的危险。所以大家在编糭 jad 文件的时候应该尽量小心才好 特别注意,wtk 的 jad 自动生成的工具并不支持直接在 jad 和 manifest 输入 UTF-8 格式,所以手工修改这一步恐怕是免不了的了 。3.不同的手机其实支持的默认码制也是不一样的,这也是綺常出现问题的关键,CLDC 的系统属性microedition.encoding 定义了设备的默认字符编码,它的值可以使用 System.getProperty 方法取得。我

11、们也可以转化成相关的支持的编码机制来实际的运行我们的程序。这种方式我们通常会用在有关手机中文问题传输中,因为在联网时的手机是不确定的。以下我给出一段实例代码,和大家探讨一下这个问题。服务器到客户端:-下面代码是服务器端把字符写到 Client 端,綺过 gbEncoding()方法,所有的字符编码成:uXXXX.-代码:-/* Write the String data* param out* param value*/public static void writeUnicode(final DataOutputStream out, final String value) throws A

12、ctionException try final String unicode = StringFormatter.gbEncoding( value );final byte data = unicode.getBytes();final int dataLength = data.length;System.out.println( Data Length is: + dataLength );System.out.println( Data is: + value );out.writeInt( dataLength ); /先写出字符串的长度out.write( data, 0, da

13、taLength ); /然后写出转化后的字符串 catch (IOException e) throw new ActionException( IMDefaultAction.class.getName(), e.getMessage() );-以下代码是 gbEncoding()方法,把双字节字符转换成uXXXX,ASIIC码在前面补 00。-/* This method will encode the String to unicode.* param gbString* return*/代码:-public static String gbEncoding( final String

14、 gbString ) char utfBytes = gbString.toCharArray();String unicodeBytes = ;for( int byteIndex = 0; byteIndex -1 ) end = dataStr.indexOf( u, start + 2 );String charStr = ;if( end = -1 ) charStr = dataStr.substring( start + 2, dataStr.length() ); else charStr = dataStr.substring( start + 2, end);char letter = (char) Integer.parseInt( charStr, 16 ); / 16 进制 parse整形字符串。buffer.append( new Character( letter ).toString() );start = end;return buffer;-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号