Насколько хорошо ваш язык поддерживает Unicode на практике?

Я смотрю на новые языки, вроде влечения к той, где я больше не нужно беспокоиться о кодировке проблем среди кучу других мелочей, я с PHP на новый проект.

Я, как правило, нахожу Java слишком многословным и грязным, и мое нежелание прикасаться к окнам шестифутовым столбом, как правило, исключает .Сеть. Это оставляет по существу все остальное - кроме PHP, C и c++ (последние два из которых, как я знаю, запутываются с unicode, независимо от ICU библиотека.)

я кратко перечислил несколько языков на сегодняшний день, а именно Ruby (любил mixins), Python, Lisp и Javascript (узел.в JS). Тем не менее, я иду с высоко непоследовательны информация on unicode поддержка и я боюсь (нехватка времени...) изучить каждый из них до такой степени, чтобы я мог безопасно его нарушить, чтобы исключить его.

насколько я понял, Python 3 кажется чтобы иметь его. Как и Ruby 1.9. Шепелявить!--19-->не обязательно. Предположительно, Javascript.

существует, возможно, больше, чем поддержка unicode для языка, но по моему опыту он имеет тенденцию становиться основным недостатком при работе с locale.

Я также понимаю, что вопрос несколько субъективен. (Пожалуйста, не закрывайте его на этом основании: я на самом деле связываюсь с несколькими потоками SO, которые я нашел неудовлетворительными.) Но... как пользователь любого из этих языков, насколько хорошо они поддерживают unicode на практике?

6 ответов


поддержка юникода Python на самом деле не изменилась в 3.х. Юникод поддержка в Python было почти то же самое с Python 2.x, который ввел отдельный unicode тип и обработка кодировки. Что Такое Python 3.X изменения заключается в том, что unicode становится единственным строковым типом (и переименовывается в str), тогда как 2.x имеет bytestrings (str, "...") и Юникод (unicode, u"..."), что часто, но не всегда и не совсем микс. (Позволить им смешаться было попыткой сделать переход с bytestrings на unicode проще, но это оказалось ошибкой.) В целом, поддержка юникода Python довольно хороша, ошибки в Python 2.несмотря ни на что. Есть литералы unicode с числовыми и именованными экранированиями, объявления исходного кода для символов, отличных от ASCII, в литералах unicode, автоматическое кодирование / декодирование через codecs модуль, поддержка unicode во многих библиотеках (например, модули регулярного выражения и DB-API) и встроенный unicode база данных.

ты еще нужно знать о кодировках, чтобы правильно обрабатывать текст. Ваша программа будет получать байты в некоторой кодировке (будь то из файлов, из переменных среды или через другой вход), и их нужно будет интерпретировать в этой кодировке. Если вы не знаете кодировку (и не можете определить ее по данным, как в HTML или XML), вы можете обрабатывать данные только как байты. Если вы знаете кодировку, Python позволяет вам разбирайтесь с этим в основном прозрачно.


Perl имеет отличную поддержку unicode. Вы должны знать, как правильно использовать, но я никогда не нахожу языка, который имеет лучшую поддержку unicode, чем perl, особенно теперь с perl5.14.


ракетка (в лагере Lisp/Scheme) имеет хорошую поддержку Unicode. Ракетка отличает строки символов (написано "abc") от байтовые строки (написано #"abc"). Символьные строки состоят из символов Юникода и имеют все строковые операции, которые можно было бы ожидать (сравнение, складывание регистров и т. д.). По умолчанию Racket использует UTF-8 для ввода-вывода символьной строки (включая кодировку исходных файлов), но также поддерживает преобразование в и из других кодировок. Инструментарий GUI работает с Unicode. Как и регулярные выражения.


из моего личного опыта Ruby 1.9.2 обрабатывает unicode внутри довольно хорошо, за исключением некоторых странных областей, таких как методы upcase/downcase/capitalize для класса String. Я должен переопределить их для всех моих Rails приложений.


шепелявит имеем сильную поддержку Unicode. Все современные популярные lisps (SBCL, Clozure CL, clisp) используют UTF-32/UCS-4 для строк и поддерживают 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,С причиной.