niyue

Archive for September, 2006|Monthly archive page

编码问题释疑

In other, programming on September 23, 2006 at 9:08 PM

生活在中国的程序员恐怕没有不会碰到这个问题的–编码问题. unicode, utf-8, GBK, charset, encoding, code page这么一大堆术语加缩写,让人一看到就头晕,根本搞不清哪个是哪个. 各种各样的地方都会出现编码问题–数据库, JSP, mp3标签等等等等,不一而足. 我自己就花了不少时间解决编码的问题(还曾经写了一个很粗糙的Firefox的扩展来修正网页的编码),但面对这么多的术语,再加上平时解决问题时间有限,一般都是找了个方法摆脱了乱码问题之后就再也不想去看这个玩意了。今天本来是想比较一下python和ruby两个语言的,结果从ruby对unicode的支持问题开始,又回到了编码问题上来,终于决定把这些东西搞个清楚。

不过相关术语是在太多了,我建议大家先去看Unicode的词汇表,有什么疑问的词就可以在这个表里面search一下,一般可以立即得到一个清晰准确的解释,我主要结合wikipedia上对unicode的注释(unaccessible for some well-known reason)和unicode的这个词汇表讲几个最常碰到的词语和几个最大的疑惑。
confusing question:
Q: 编码到底是怎么一回事(-_-超级大问题,就解决这一个了决定)?
A: 历史上,编码问题最初是不存在的或者说不是什么大问题(很明显的,计算机发展初期只有英文使用者),字符集和字符编码是不区分的,统一用charset这个词来表示,同时兼了这两个词的含义.到了现代,编码这个问题被解耦成为几个部分:

1. what characters are available
2. their numbering
3. how those numbers are encoded as a series of “code units”
4. how those units are encoded as a stream of octets (bytes)

部分1指的就是字符集,表示可用的所有的字符,包括数字,字母,标点,汉字等等.
部分2指的是编码字符集(这里用英文可能更准确一些coded character set,被编码了的字符集),也即部分1中的每个字符会映射到一个或多个数字或者其他符号,由这些符号来代表部分1中的字符.
部分3和4指的是如何将2中映射得到的数字最终表示为计算机可以识别的二进制串(3,4拆分为两步的主要原因于计算机对字节流的解释有关big-endian or little-endian,不考虑的话应该可以合并).
从这四个部分可以看出,解决编码问题需要定义字符集,定义映射方案,定义编码方案这几个重要步骤.

Q: Unicode又是怎么一回事,它和utf-8有什么关系?
A: Unicode和另外一个与之并列的标准ISO 10646共同组成了一个上面提到的解决编码问题的解决方案,它不是四个部分中的任何一个,而是这四个部分各自解决方案的一个组合.其中字符集是由ISO 10646定义的,numbering应该在Unicode的标准中有(?^_^我也没看过,不确定).utf-8是Unicode提供的用于解决编码子问题的方案之一,同时还有utf-16和utf-32等等编码方案.

Q: code page呢?
A: code page就是coded character set,最初是IBM使用的一个术语,后来微软也大量使用.

这就是我的demystifying encoding problem, 如有不当请指教.
http://www.niyue.com

参考文献:
[1] Glossary of Unicode Terms http://www.unicode.org/glossary/
[2] Unicode in Wikipedia http://en.wikipedia.org/wiki/Unicode
[3] Character encoding in Wikipedia http://en.wikipedia.org/wiki/Character_encoding

static关键字的含义

In programming on September 23, 2006 at 3:23 PM

在许多编程语言里面都可以见到static这个关键字,虽然很常见,但是对于它的具体含义我却一直不是很了解,为什么这个要叫做static而不是其他?比如在C,C++,Java,C#里面都有这个关键字,说明这个关键字的字面意思应该是能够表明它的含义的(否则不会这么巧大家都用这个关键字),但是这个关键字的含义又不是那么简单可以望文生义,今天自己花了一些时间看了看,有了个相对清晰的了解.

这个Q&A(What does the keyword ‘static’ mean?)是我最开始找到的资料,问的问题是我想问的,但是答案确不是.

The static keyword denotes that a member variable, or method, can be accessed without requiring an instantiation of the class to which it belongs.

它说明了static关键字所表示的结果含义,但是没有说明为什么代表这个含义使用了static这个关键字.而这个含义其实是有一定编程经验的人都知道的,大家都这么用,但是不知道为什么这个是叫static而不是其他的.
我又继续看了一些资料(参见下面的参考文献),自己总结了一下:

  1. static这个关键字想要表达的是变量或者方法等的生命周期,而不是访问的作用域的控制,这可以和public,private(Java等语言)这些关键字区分开来.
  2. static这个关键字的字面含义”静态”说明了由static声明的变量或者函数等的生命周期控制信息的存放地点–静态数据存储区域.

接下来我详细的解释这两点:

  1. static声明的往往是一个用做全局的变量,类实例等.这个”全局”主要说的是通过static声明,声明的变量等可以增大其生命周期到某个全局的范围,比如Java类里面声明了一个static的变量,则它的生命周期和这个类相同–贯穿程序运行的全过程.因为不会消亡,所以你在引用这一static变量的时候只会引用到同一个变量,看起来就是一个类级别的变量(从结果看起来这样理解也可以,类似与Ruby中的@@来声明变量,但这样很容易知其然而不知所以然).在c语言中并没有类的概念,因此这种说法就不大行得通.在c语言中声明了一个static的变量之后,这一变量的生命周期就可以跨越声明它的文件中的所有函数,当然,这个时候的含义可能也包括了访问控制的含义在里面,但是我理解更主要的还是生命周期的改变.
  2. 生命周期控制数据的存放地点.要理解这一点,首先要知道有哪些地方可以用来存储程序中使用的数据.对于这一点,文献[1][2]讲述的很清楚,大家可以参考,我就不重复了.主要讲一下随机存储器RAM中的三种存储方式栈,堆,静态存储(stack,heap,static storage).看到这里,大家应该都知道由static声明的话,生命周期相关的信息会存在哪里了吧,至于static这个名字是怎么来的,也不用多说了.对Java来说,
    1. 一般的不是由static声明的变量,如果是原始的数据类型,会直接保存在stack上,如果是通过new得到的对象实例,这一对象的引用会保存在堆栈上,其实际的数据会保存在heap上,如果这一变量相关的数据被pop出栈,那么这一变量的生命周期也就结束了.如果是对象的话,其在堆上的对应内存也会被释放,这以后就再也无法访问这一对象了.
    2. 如果是由static声明的变量,不是在stack上存放引用等信息,而是在静态存储区域存放,这样即使堆栈内容变化也不会影响这些变量的创建或者消亡,从而可以不实例化一个类直接通过静态存储区域找到这一变量使用.

这些就是我的一个小结,有部分是我自己的理解,可能不是很正确,请大家指教.

Update: 文献[9]是一篇写的很好的文章,我对static声明函数的含义可能有些曲解,大家可以参考文献[9]最后的static函数及其扩展分析.

参考文献:

  1. 对象保存在哪里? http://www.qsl.net/bd5hag/JavaCourse/Lesson2/2_9_1.htm
  2. c storage class http://www.phim.unibe.ch/comp_doc/c_manual/C/SYNTAX/storage_class.html#static
  3. Static Variable in Wikipedia http://en.wikipedia.org/wiki/Static_variable
  4. Local Variable in Wikipedia http://en.wikipedia.org/wiki/Local_variable
  5. Call Stack in Wikipedia http://en.wikipedia.org/wiki/Call_stack
  6. this and static keyword, Thinking in Java http://columnist.chinabyte.com/xufeng.cq/149/2183649.shtml
  7. 小议static http://www.csdn.net/develop/Article/20/20219.shtm
  8. What does the keyword ‘static’ mean? http://www.javacoffeebreak.com/faq/faq0010.html
  9. static关键字Q/A http://home.zhuonline.net/archives/2005/09/staticqa.html

几个有用的ubuntu的软件库

In software, ubuntu on September 9, 2006 at 10:34 AM

在Ubuntu上面安装软件真的很方便,只要记得apt-get install/remove就能够搞定大多数的软件了.不过有的时候有些软件的最新版本刚刚发行,还没有添加到官方的软件库中,这个时候想用新版本但是没得用就比较痛苦了.这时有三个选择:

  1. 放弃使用新版本,继续使用旧版本直到官方软件库发布新版本
  2. 自己编译新软件而后手动安装
  3. 寻找uptodate的软件库,添加新的软件库并安装想要的新软件

无疑方法1并不是什么很好的办法,还是不能立刻用上需要的新特性;而方法2则退回到了原始的状态,每次安装一个软件可能都要看半天如何编译如何安装,其中可能会碰到的问题等等,一个简单的软件可能都需要半天时间才能顺利装好,这当中耗费的时间很不值得.所以我的一般选择都是方法3,如果3不能解决的话可能就会先不使用新版本,一直等到官方的repository上面有release为止了.

这里列举几个有用的软件库,包含了最近我想要的一些新软件的发布(当然其他的软件库可能也有,这里只是列几个我知道的):

  1. Opera 9以及Real Player 10(deb http://archive.canonical.com/ubuntu dapper-commercial main)
  2. Skype (deb http://download.skype.com/linux/repos/debian/ stable non-free)
  3. Vim7 (deb http://mirror.ubuntulinux.nl dapper-seveas all)