2008年12月16日星期二

常见字符集(charset)

使用过很多编程语言,但一直没去深入学习如"字符集(charset)","编码"之类的问题,因此也常常因"乱码"、"编码(encode)"、"解码(decode)"这些问题而苦恼不堪。虽然这些问题基本都能在网上找到相应的办法,但是不能从根本上理解怎么回事,实在是不应该。所以还是决定好好补补相关的基础知识。

先来了解一下常见的字符集(charset)

ASCII(RFC 0020)

ASCII码是7位编码,编码范围是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。其中0x00-0x20和0x7F共33个控制字符。 只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。 还有一篇介绍ASCII,里面的ASCII表更加直观,ASCII Table: 7-bit

还有几篇关于ASCII和中文的,应该看看:

UTF-8(RFC 3629)

Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

UTF-8 and Unicode Standards(官网) RFC 3629
GB2312/GBK/CP936/GB18030

GB2312 是汉字字符集和编码的代号,中文全称为“信息交换用汉字编码字符集”, 由中华人民共和国国家标准总局发布,一九八一年五月一日实施。GB 是“国标” 二字的汉语拼音缩写。 GB2312 共收录有 7445 个字符,其中简化汉字 6763 个,字母和符号 682 个。在http://www.herongyang.com/gb2312_gb/overview.html介绍的很清楚。

GBK编码是GB2312编码的超集,向下完全兼容GB2312,同时GBK收录了Unicode基本多文种平面中的所有CJK汉字。同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符(非汉字字符)。GBK还收录了GB2312不包含的 汉字部首符号、竖排标点符号等字符。GBK对照表

Cp936和GBK的有些许差别(Cp936是微软制定的,详情请参考微软网站),绝大多数情况下可以把CP936当作GBK的别名。

2000 年的 GB18030 取代了 GBK1.0 的正式国家标准。该标准收录了 27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持 GB18030 ,对嵌入式产品暂不作要求。所以手机、MP3 一般只支持 GB2312。 GB18030 在 Windows 中的代码页是 CP54936

Unicode

每一种语言的不同的编码页,增加了那些需要支持不同语言的软件的复杂度。因而人们制定了一个世界标准,叫做unicode。unicode为每个字符提供 了唯一的特定数值,不论在什么平台上、不论在什么软件中,也不论什么语言。也就是说,它为世界上使用的所有字符都列出来,并给每一个字符一个唯一特定数值。

Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache's),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。

因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符 是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在 UTF-8和ASCII中,“A”的编码都是0x41.

UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。在讨论Unicode时,搞清楚哪种编码方式非常重要。

总结:不同字符集有代表的字符,有的根本不同,有些有交叉,有些是兼容的。字符集就是一个编码表,把字符编码成数字,为的就是让我们能看懂的文字、符号变成计算机能看懂的机器码。

2008年12月2日星期二

深入理解Java关键字:native

1.native是什么

native是方法修饰符。native方法是由另外一种语言(如C/C++ ,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在Java代码中,就不需要具体实现了,有点类似于接口方法,只是在类中声明了一个方法。native可以和其他一些修饰符连用,但是abstract方法和interface方法不能用native来修饰。

2.为什么需要native

一般在碰到下面几种情况时,开发者会通过JNI来编写本地方法:

  • 标准Java类库并不支持的依赖于平台的特色或者程序库;
  • 处于性能的考虑,而单纯Java方法实现达不到需求;
  • 为了调用某些现成的类库;

3.如何使用native

如何调用native方法

native方法只是在Java类中做出了声明,如何让代码能调用到具体的实现部分呢?这当然需要调用的人知道这部分实现代码放在那里。在Windows平台下,一般这样的代码会封装在dll(dynamic link library)中;在Unix系的平台中,一般会以so(shared object)的形式存在。所以在调用native方法前,需要我们调用java.system.loadLibrary()方法装载具体的native代码。

如何实现native方法

参考Java Native Interface Programming ,这里有非常完整的描述,包括一个完整的步骤,英文好的看这里。

参考:
  1. Java Native Interface Programming
  2. Java本地接口(Java Native Interface (JNI))
  3. Windows平台,如何将c编译成dll
  4. Java native Method初涉
 
Sign In