你的语言在实际中对unicode支持得怎么样?
我在考虑学习新的编程语言,想找一种不需要再担心字符集问题的语言,因为我在用PHP做新项目时遇到了很多麻烦。
我觉得Java太啰嗦、太乱,而且我不想碰Windows,这让我排除了.Net。这样一来,几乎所有其他语言都可以考虑,除了PHP、C和C++(这两种语言在处理unicode时也会很麻烦,不管有没有用ICU库)。
到目前为止,我已经缩小了选择范围,考虑了几种语言,比如Ruby(我喜欢它的mixins)、Python、Lisp和Javascript(node.js)。不过,我发现关于这些语言的unicode支持的信息非常不一致,我很担心(因为时间不够)要学习每一种语言到可以安全地判断它们的程度。
据我了解,Python 3 似乎支持unicode,Ruby 1.9也是。至于Lisp,不一定。Javascript应该也是。
虽然语言的支持不止于unicode,但根据我的经验,当处理地区设置时,unicode支持往往会成为一个主要问题。
我也意识到这个问题有点主观。(请不要因为这个理由就关闭这个问题:我实际上链接了几个我觉得不够满意的SO讨论。)但是...作为这些语言的用户,它们在实际使用中对unicode的支持怎么样呢?
6 个回答
Racket(属于Lisp/Scheme家族)对Unicode的支持很好。Racket把字符字符串(写作"abc"
)和字节字符串(写作#"abc"
)区分开来。字符字符串由Unicode字符组成,支持所有你想象中的Unicode字符串操作,比如比较、大小写转换等等。默认情况下,Racket在处理字符字符串的输入输出时使用UTF-8编码(包括源文件的编码),但它也支持转换成其他编码格式。它的图形用户界面工具包也能处理Unicode,正则表达式也是如此。
Perl对unicode的支持非常好。你需要知道怎么正确使用它,但我从来没有发现哪个语言的unicode支持比Perl更强,尤其是现在的Perl 5.14版本。
Python的Unicode支持在3.x版本中其实没有太大变化。自从Python 2.x引入了单独的unicode
类型和编码处理后,Unicode的支持基本上就保持不变。Python 3.x的变化在于,Unicode成为了唯一的字符串类型,并且被重新命名为str
。而在2.x版本中,有字节字符串(str
,"..."
)和Unicode字符串(unicode
,u"..."
),这两者之间的混用并不总是顺利。(允许它们混用是为了让从字节字符串过渡到Unicode更简单,但结果证明这是个错误。)总的来说,Python的Unicode支持还是相当不错的,尽管在Python 2.x中有些错误。它支持带有数字和命名转义的Unicode字面量,能够为Unicode字面量中的非ASCII字符声明源编码,通过codecs
模块实现自动编码/解码,许多库(比如正则表达式和数据库API模块)也支持Unicode,还有一个内置的Unicode数据库。
不过,你仍然需要了解编码,以便正确处理文本。你的程序会接收到某种编码的字节(可能来自文件、环境变量或其他输入),这些字节需要按照相应的编码进行解释。如果你不知道编码(并且无法从数据中判断,比如在HTML或XML中),你只能将数据当作字节来处理。如果你知道编码,Python基本上可以让你透明地处理它。