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初涉

2008年11月29日星期六

Java中的包名(package)为什么都以小写字母为标准呢?

在Java编程思想(Thinking In Java)的2.6.1名字的可见性中,作者提到:

在Java 1.0和Java 1.1中,域扩展名com,edu,org,net等都约定为大写形式。所以库的样子就变成:COM.bruceeckel.utility.foibles。然而,在Java 1.2的开发过程中,设计者发现这样做会造成一些问题。所以目前的整个软件包都以小写字母为标准” 。

为什么要做这样的改变呢?

可能是为了适应不同的操作系统而做的改变吧。因为Unix系的操作系统是大小写敏感的,所以如果在操作系统中"COM"和"com"两个文件夹被认为是两个不同的文件夹;而在Windows操作系统中,大小写是不敏感的,因此"COM"和"com"两个文件夹为被认为是同一个文件夹。正因为这样,如果有人正好在Unix系的操作系统下写了两个包名为"COM.bruceeckel.utility.foibles"和"com.bruceeckel.utility.foibles"的工具包,迁移到Windows上面来的时候,就会出问题了。这样就好解释Java1.2要把包名统一成小写了。

2008年11月26日星期三

Work hard, study hard

昨天接到某公司的电话面试,发现很多简单的问题都答不上来,真是无地自容啊。确实在基础知识这方面没有夯实,而且没有及时总结有关知识点,很多概念含糊不清,虽然平时开发没碰到过什么大问题,但是在学习的系统性上是很薄弱的。所以接下来一年应该从基础抓起,而且及时总结知识。

毕业四年了,感觉进步不是很大。总结一个字,“懒”。不能再得过且过了,是时候改变一下了

2008年11月20日星期四

Study couchdb

今天听说了Couchdb这个东西,号称是文档数据库,看起来似乎跟现在的关系数据库大不相同啊。有机会一定要好好研究一下。 网站先记录一下:http://incubator.apache.org/couchdb/

2008年9月12日星期五

HTML标签和属性的语义

如果英文好的话,那么看下面这个表格就可以明白标签的含义了。

标签英文
hheading
pparagraph
brbreak
ememphasis
strongstrong
ulunordered list
olordered list
lilist item
dldefinition list
dtdefinition term
dddefinition description
prePreformatted text
tabletable
trtable row
thtable header cell
tdtable data cell
<h1><h2><h3><h4><h5><h6>
h是heading的缩写,即标题、题目的意思

这里<hx>是指<h1> <h2> <h3> <h4> <h5> <h6>,数字表示级别,即h1表示一级标题,h2表示2级标题,以此类推。

<p>
p是paragraph的缩写,即段落的意思。文章的每个段落都应该使用<p></p>。
<br/>
br是break的缩写,即强制换行。
<em>
em是emphasis的缩写,即表示强调。有时候为了突出你要表达的某个词或句子,就应该用这个标签
<strong>
strong 也是用于强调,比em更进一步强调。
<ul><li>
ul是unordered list的缩写,即无序列表,表示每个列表里的项是无序的,或者作者没想过要编号;li是list item的缩写,即列表项
<ol><li>
ol是ordered list的缩写,即有序列表,表示列表里的项是有序的,可以对其编号。li是list item的缩写,即列表项
<dl><dt><dd>
dl是definition list的缩写,即定义列表。dt是definition term的缩写,即定义条目,dd是definition description的缩写,即定义描述。

用于条目解释是最好的例子。

<pre>
pre是 Preformatted text的缩写,即预先格式化的文本。为了表现用户指定的文本表现形式,可以用pre标签。在pre标签内的文本,空格、换行等元素都不会被转义,会原原本本保留下来。
<table><thead><tfoot><tbody><tr><th><td>
这是一组关于表格的标签。一般很少用到<thead>和<tfoot>,因为目前有些浏览器对其支持还不是很好,所以大家基本上都是避而远之。<tr>是指表格的一行,在这一行里,有若干列,就是包含的<th>或是<td>。<th>是table header cell的缩写,意思是表格头部单元格,一般用做说明数据内容;<td>是table data cell的缩写,意思是数据单元格。
<div>/<span>
div是division的缩写,span是小范围的意思,两者本意是作为语言与样式的容器(generic language/style container),只是div默认呈现内容的样式是block,而span默认呈现内容的样式是inline。所以div通常被人们用作布局的好东西,而span被作为修改文字样式的标签。

这里只写了常用的标签,有很多没有写出来,想看完整的内容,到w3.org,这里有最详细最权威的解释。

 
Sign In