您的语言在实践中如何支持unicode?

我正在研究新的语言,渴望一种我不再需要担心字符集之间的问题,我用PHP来处理一个新的项目。

我倾向于发现Java太冗长和杂乱,而且我不想用一个6英尺的杆子去碰Windows,往往会排除.Net。 除了PHP,C和C ++(其中后两者我知道与unicode的东西无关,与ICU库无关),基本上就是一切。

到目前为止,我已经列出了几种语言,即Ruby(喜欢mixins),Python,Lisp和Javascript(node.js)。 但是,我提供的unicode 支持 信息非常不一致 ,而且我害怕(缺乏时间…)去学习它们中的每一个,直到我可以安全地破坏它来排除它。

据我所知,Python 3 似乎有它。 Ruby 1.9也是如此。 Lisp 不一定 。 大概是Javascript。

对于一种语言来说,可以说unicode支持不止于此,但就我的经验来看,它在处理语言环境时往往成为一个主要的缺点。

我也意识到这个问题有点主观。 (请不要closures它的理由:我实际上链接到几个SO线程,我觉得不令人满意。)但是…作为这些语言的用户,他们在实践中如何支持unicode?

Python的unicode支持在3.x中并没有真正改变。 自从Python 2.x引入了单独的unicodetypes和编码处理以来,Python中的unicode 支持已经差不多了。 什么Python 3.x变化是unicode成为唯一的stringtypes(并重命名为str ),而2.x有bytestrings( str"..." )和unicodestring( unicodeu"..." )经常但不总是不太合适。 (允许它们混合是一个试图从bytestrings过渡到unicode更容易,但它是一个错误。)总而言之,Python的unicode支持是相当不错的,尽pipePython 2.x的错误。 有unicode文字,包括数字和命名转义,unicode文字中非ASCII字符的源编码声明,通过codecs模块的自动编码/解码,许多库中的unicode支持(如正则expression式和DB-API模块)以及内置unicode数据库。

也就是说,为了正确处理文本,您仍然需要了解编码。 你的程序将接收到一些编码的字节(可以是文件,环境variables或其他input),并且需要用该编码进行解释。 如果您不知道编码(并且无法从数据中确定它,例如HTML或XML),那么您只能按字节处理数据。 如果你知道编码,Python确实允许你透明地处理它。

Perl对unicode有很好的支持。 你需要知道如何使用是正确的,但我从来没有find任何语言比perl有更好的Unicode支持,特别是现在用perl5.14。

球拍 (在Lisp / Scheme阵营)有很好的Unicode支持。 球拍区分string (写成"abc"string (写入#"abc" )。 string由Unicode字符组成,并具有所有可以识别Unicode的string操作(比较,大小写折叠等)。 默认情况下,Racket使用UTF-8作为stringI / O(包括源文件的编码),但是它也支持与其他编码的转换。 GUI工具包使用Unicode。 所以做正则expression式。

从我个人的经验来看,Ruby 1.9.2处理unicode内部相当不错,除了一些奇怪的区域,比如String类的upcase / downcase / capitalize方法。 我必须覆盖他们所有我的Rails应用程序。

Lisp对unicode有很强的支持。 所有现代stream行的Lisp(SBCL,Clozure CL,clisp)都使用UTF-32 / UCS-4作为string,并支持UTF-8作为外部格式。

Ruby例子:

 # encoding: UTF-8 puts RUBY_VERSION # => 1.9.2 def Σ(arr) arr.inject(:+) end Π = Math::PI str = "abc日本def" puts Σ [4,6,8,3] # => 21 puts Π # => 3.141592653589793 puts str.scan(/\p{Han}+/) # => 日本p Encoding.name_list # not just utf8 #["ASCII-8BIT", "UTF-8", "US-ASCII", "Big5", "Big5-HKSCS", "Big5-UAO", "CP949", "Emacs-Mule", "EUC-JP", "EUC-KR", "EUC-TW", "GB18030", "GBK", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "KOI8-R", "KOI8-U", "Shift_JIS", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "Windows-1251", "BINARY", "IBM437", "CP437", "IBM737", "CP737", "IBM775", "CP775", "CP850", "IBM850", "IBM852", "CP852", "IBM855", "CP855", "IBM857", "CP857", "IBM860", "CP860", "IBM861", "CP861", "IBM862", "CP862", "IBM863", "CP863", "IBM864", "CP864", "IBM865", "CP865", "IBM866", "CP866", "IBM869", "CP869", "Windows-1258", "CP1258", "GB1988", "macCentEuro", "macCroatian", "macCyrillic", "macGreek", "macIceland", "macRoman", "macRomania", "macThai", "macTurkish", "macUkraine", "CP950", "CP951", "stateless-ISO-2022-JP", "eucJP", "eucJP-ms", "euc-jp-ms", "CP51932", "eucKR", "eucTW", "GB2312", "EUC-CN", "eucCN", "GB12345", "CP936", "ISO-2022-JP", "ISO2022-JP", "ISO-2022-JP-2", "ISO2022-JP2", "CP50220", "CP50221", "ISO8859-1", "Windows-1252", "CP1252", "ISO8859-2", "Windows-1250", "CP1250", "ISO8859-3", "ISO8859-4", "ISO8859-5", "ISO8859-6", "Windows-1256", "CP1256", "ISO8859-7", "Windows-1253", "CP1253", "ISO8859-8", "Windows-1255", "CP1255", "ISO8859-9", "Windows-1254", "CP1254", "ISO8859-10", "ISO8859-11", "TIS-620", "Windows-874", "CP874", "ISO8859-13", "Windows-1257", "CP1257", "ISO8859-14", "ISO8859-15", "ISO8859-16", "CP878", "SJIS", "Windows-31J", "CP932", "csWindows31J", "MacJapanese", "MacJapan", "ASCII", "ANSI_X3.4-1968", "646", "UTF-7", "CP65000", "CP65001", "UTF8-MAC", "UTF-8-MAC", "UTF-8-HFS", "UCS-2BE", "UCS-4BE", "UCS-4LE", "CP1251", "UTF8-DoCoMo", "SJIS-DoCoMo", "UTF8-KDDI", "SJIS-KDDI", "ISO-2022-JP-KDDI", "stateless-ISO-2022-JP-KDDI", "UTF8-SoftBank", "SJIS-SoftBank", "locale", "external", "filesystem", "internal"] 

的确,资本化并不支持非ASCII字符。

Interesting Posts