我正在寻找新的语言,对于我不再需要担心我用PHP用于新项目的其他大量问题中的字符集问题的方式。
我倾向于发现Java过于冗长和混乱,我不想用6英尺长的杆触摸Windows往往会排除.Net。这基本上留下了其他所有东西 - 除了PHP,C和C ++(后者其中两个,我知道无论ICU库如何都会弄乱unicode东西)。
我简要列出了迄今为止的一些语言,即Ruby(喜欢mixins),Python,Lisp和Javascript(node.js)。但是,我高度inconsistent information on unicode support,我很害怕(缺乏时间...)来学习每一个他们每个人都可以安全地打破它来排除它。
据我所知,Python 3 似乎拥有它。和Ruby 1.9一样。 Lisp not necessarily。大概是Javascript。
对于某种语言而言,可能不仅仅是unicode支持,但根据我的经验,它在处理语言环境时往往成为一个主要缺点。
我也意识到这个问题有些主观。 (请不要因为这个原因关闭它:我实际上是链接到我发现不满意的几个SO线程。)但是......作为这些语言的用户,它们在实践中如何支持unicode?
答案 0 :(得分:7)
Python的unicode支持在3.x中没有真正改变。 Python中的unicode support 与Python 2.x基本相同,后者引入了单独的unicode
类型和编码处理。 Python 3.x更改的是unicode成为唯一的字符串类型(并重命名为str
),而2.x具有字节串(str
,"..."
)和unicode字符串({ {1}},unicode
)经常但并非总是不完全混合。 (允许它们混合是尝试从字节串转换到unicode更容易,但结果是错误。)总而言之,Python的unicode支持相当不错,尽管Python 2.x中存在错误。有unicode文字和数字和命名转义,unicode文字中非ASCII字符的源编码声明,u"..."
模块自动编码/解码,许多库中的unicode支持(如正则表达式和DB-API模块) )和内置的unicode数据库。
那就是说,仍需要知道编码才能正确处理文本。您的程序将以某种编码(无论是来自文件,来自环境变量还是通过其他输入)接收字节,并且需要以该编码进行解释。如果您不知道编码(并且无法从数据中确定它,如HTML或XML),您实际上只能将数据作为字节处理。如果您确实知道编码,Python确实允许您主要透明地处理它。
答案 1 :(得分:6)
Perl非常支持unicode。您需要知道如何正确使用,但我从来没有找到任何语言比perl更好的unicode支持,特别是现在使用perl5.14。
答案 2 :(得分:3)
Racket(在Lisp / Scheme阵营中)具有良好的Unicode支持。 Racket将字符串(写成"abc"
)与字节字符串(写为#"abc"
)区分开来。字符串由Unicode字符组成,并具有所期望的所有Unicode感知字符串操作(比较,大小写折叠等)。默认情况下,Racket使用UTF-8进行字符串I / O(包括源文件的编码),但它也支持与其他编码的转换。 GUI工具包使用Unicode。正则表达式也是如此。
答案 3 :(得分:2)
根据我的个人经验,Ruby 1.9.2内部处理unicode非常好,除了一些奇怪的区域,比如String类的upcase / downcase / capitalize方法。我必须为我的所有Rails应用程序覆盖它们。
答案 4 :(得分:2)
Lisps强烈支持unicode。所有现代流行的lisps(SBCL,Clozure CL,clisp)都使用UTF-32 / UCS-4作为字符串,并支持UTF-8作为外部格式。
答案 5 :(得分:1)
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字符不支持大写,with reason.