Поддержка Unicode на разных языках программирования - PullRequest
31 голосов
/ 24 июня 2009

Мне бы хотелось иметь каноническое место для сбора информации о поддержке Unicode на разных языках. Это часть основного языка? Это предусмотрено в библиотеках? Это не доступно вообще? Есть ли ресурс популярный ресурс для информации Unicode на языке? Один язык за ответ, пожалуйста. Также, если бы вы могли сделать язык заголовком, который облегчил бы его поиск.

Ответы [ 20 ]

3 голосов
/ 01 июля 2009

JavaScript

Похоже, до JS 1.3 не было поддержки Unicode. Начиная с 1.5 поддерживаются UTF-8, UTF-16 и UCS-2. Вы можете использовать escape-последовательности Unicode в строках, регулярных выражениях и идентификаторах. Источник

3 голосов
/ 15 сентября 2016

ржавчина

Строки Rust (std::String и &str) всегда являются допустимыми UTF-8 и не используют нулевые терминаторы, и в результате не могут быть проиндексированы как массив, как они могут быть в C / C ++ и т. Д. Они могут быть нарезаны, как Go, используя .get начиная с 1.20, с оговоркой, что произойдет сбой, если вы попытаетесь нарезать середину кодовой точки.

Rust также имеет OsStr / OsString для взаимодействия с ОС хоста. Это байтовый массив в Unix (содержащий любую последовательность байтов). В Windows это WTF-8 (супер-набор UTF-8, который обрабатывает неправильно сформированные строки Unicode, разрешенные в Windows и Javascript), &str и String могут быть свободно преобразованы в OsStr или OsString , но требуют проверки, чтобы скрыть другой путь. Либо из-за неверного Unicode, либо с заменой на символ замены Unicode. (Существует также Path / PathBuf, которые являются просто обертками вокруг OsStr / OsString).

Существуют также типы CStr и CString, которые представляют строки C с нулевым символом в конце, например OsStr в Unix, они могут содержать произвольные байты.

Rust напрямую не поддерживает UTF-16. Но может конвертировать OsStr в UCS-2 в Windows.

2 голосов
/ 23 августа 2010

Objective-C

Нет встроенного, кроме того, что доступно как часть библиотеки строк C.

Однако, как только вы добавите рамки…

Основа (Какао и Touch Cocoa) и Базовая основа

NSString и CFString каждый реализует полностью строковый класс на основе Unicode (фактически несколько классов, как деталь реализации). Эти два типа являются «бесплатными мостами», так что API для одного можно использовать с экземплярами другого, и наоборот.

Для данных, которые не обязательно представляют текст, есть NSData и CFData. NSString предоставляет методы, а CFString предоставляет функции для кодирования текста в данные и декодирования текста из данных. Core Foundation поддерживает более сотни различных кодировок, включая все формы UTF. Кодировки делятся на две группы: встроенные кодировки , которые поддерживаются повсеместно, и внешние кодировки , которые по крайней мере поддерживаются в Mac OS X.

NSString предоставляет методы нормализации для форм D, KD, C или KC. Каждый возвращает новую строку.

И NSString, и CFString предоставляют широкий спектр опций сравнения / сопоставления. Вот Флаги опций сравнения Foundation и Флаги опций сравнения Core Foundation . Они не все являются синонимами; например, Core Foundation по умолчанию делает буквальное (строго на основе кодовой точки) сравнение, тогда как Foundation делает не буквальное сравнение (позволяя символам с акцентами для сравнения равными) по умолчанию.

Обратите внимание, что Core Foundation не требует Objective-C; действительно, он был создан в значительной степени для того, чтобы предоставить большинство возможностей Foundation программистам Carbon, которые использовали прямой C или C ++. Тем не менее, я подозреваю, что наиболее современное использование его в программах Cocoa или Cocoa Touch, которые все написаны на Objective-C или Objective-C ++.

2 голосов
/ 24 июня 2009

C / C ++

C

C до C99 не имеет встроенной поддержки Unicode. Он использует символьные массивы с нулевым символом в конце (char* или char[]) в качестве строк. char определяется байтом (8 бит).

C99 определяет wcs -функции в дополнение к старым str -функциям (например, strlen -> wcslen). Эти функции принимают wchar_t* вместо char*. wchar_t обозначает широкий тип символа. Размер wchar_t зависит от компилятора и может составлять до 8 бит. Хотя разные компиляторы действительно используют разные размеры, обычно это 16-битный (UTF-16) или 32-битный (UTF-32).

Большинство функций библиотеки C прозрачны для UTF-8. Например. если ваша операционная система поддерживает UTF-8 (а UTF-8 настроен как кодировка вашей системы), то при создании файла с использованием fopen с передачей строки в кодировке UTF-8 будет создан файл с правильным именем.

C ++

Ситуация в C ++ очень похожа (std::string -> std::wstring), но, по крайней мере, предпринимаются попытки получить какую-то поддержку unicode в стандартной библиотеке .

2 голосов
/ 16 февраля 2016

D

D поддерживает UTF-8, UTF-16 и UTF-32 (char, wchar и dchar соответственно). Таблицу со всеми типами можно найти здесь .

2 голосов
/ 25 июня 2009

Common Lisp (SBCL и CLisp)

Согласно эта , SBCL и CLisp поддерживают Unicode.

1 голос
/ 28 июня 2009

рубин

Единственное, что я могу найти для Ruby, это довольно старый и не слишком большой рубист, я не уверен, насколько он точен.

Для справки, Ruby поддерживает utf8, но не многобайтовый. Внутренне обычно предполагается, что строки являются байтовыми векторами, хотя есть библиотеки и приемы, которые обычно можно использовать, чтобы заставить вещи работать.

Обнаружено, что здесь .

Рубин 1,9

Ruby 1.9 прикрепляет кодировки к строкам. Двоичные строки используют кодировку «ASCII-8BIT». Хотя кодировкой по умолчанию обычно является UTF-8 в любой современной системе, вы не можете предполагать, что все функции сторонних библиотек всегда возвращают строки в этой кодировке. Он может вернуть любую другую кодировку (например, некоторые парсеры yaml делают это в некоторых ситуациях). Если вы объединяете две строки с разной кодировкой, вы могли бы получить Encoding::CompatibilityError.

1 голос
/ 01 июля 2009

PHP

На этом уже есть вся нить на SO!

0 голосов
/ 16 июня 2018

Lua

Lua 5.3 имеет встроенную библиотеку utf8, которая обрабатывает кодировку UTF-8. Это позволяет вам преобразовать серию кодовых точек в соответствующую последовательность байтов и наоборот, получить длину (количество кодовых точек в строке), перебрать кодовые точки в строке, получить позицию байта n й код. Он также предоставляет шаблон, который будет использоваться функциями сопоставления с образцом в библиотеке string, который будет соответствовать одной последовательности байтов UTF-8.

Lua 5.3 имеет escape-последовательности Unicode, которые можно использовать в строковых литералах (например, "\u{61}" для "a"). Они переводят в байтовые последовательности UTF-8.

Исходный код Lua может быть закодирован в UTF-8 или любой другой кодировке, в которой символы ASCII занимают один байт. UTF-16 и UTF-32 не поняты ванильным интерпретатором Lua. Но строки могут содержать любую кодировку или произвольные двоичные данные.

0 голосов
/ 28 июня 2009

Arc

Arc не поддерживает юникод. Но .

...