Поддержка Unicode на различных языках программирования
-
10-07-2019 - |
Вопрос
Я бы хотел иметь каноническое место для объединения информации о поддержке Unicode на различных языках.Является ли это частью основного языка?Предоставляется ли это в библиотеках?Неужели это вообще недоступно?Существует ли популярный ресурс для получения информации в Юникоде на каком-либо языке?Пожалуйста, на одном языке для каждого ответа.Также, если бы вы могли сделать язык заголовком, который облегчил бы поиск.
Нет правильного решения
Другие советы
Perl
В основном Perl имеет встроенную поддержку Unicode.Вроде того.Из perldoc:
- перлунитут - Учебное пособие по использованию Unicode в Perl.В значительной степени учит в абсолютных терминах тому, что вы должны и не должны делать в том, что касается Unicode.Охватывает основы.
- перлунифак - Часто задаваемые вопросы о Unicode в Perl.
- перлуниинтро - Введение в Unicode в Perl.Менее "нравоучительный", чем перлунитут.
- perlunicode ( перлуникод ) - Для случаев, когда вам абсолютно необходимо знать все, что только можно знать о Unicode и Perl.
Python 3k
В Python 3k (или 3.0 или 3000) появился новый подход для обработки текста (Юникод) и данных:
Текст Vs. Данные вместо Unicode Vs. 8-битовые . См. Также Unicode HOWTO .
Java
Как и в .NET, Java использует UTF-16 для внутреннего использования: java.lang.String
String
представляет строку в формате UTF-16, в которой дополнительные символы представлены суррогатными парами (см. раздел Представления символов Unicode вСимвольный
класс для получения дополнительной информации). Значения индекса относятся кchar
единицам кода, поэтому дополнительный символ использует две позиции вString
.
HQ9 +
Команда Q имеет полную поддержку Юникода в большинстве реализаций.
Delphi
Delphi 2009 полностью поддерживает Unicode. Они изменили реализацию string
по умолчанию на 16-битную кодировку Unicode, и большинство библиотек, в том числе сторонних, поддерживают Unicode. См. Дельфи и Юникод Марко Канту.
До Delphi 2009 поддержка Unicode была ограничена, но были WideChar
и WideString
для хранения 16-битной кодированной строки. См. Unicode в Delphi для получения дополнительной информации. Р>
Обратите внимание, что вы все еще можете разрабатывать двуязычное CJKV-приложение без использования Unicode. Например, строка Shift JIS для японского языка может быть сохранена с использованием простой AnsiString код>.
Вперед
Google's Перейти на язык программирования поддерживает Unicode и работает с UTF-8.
Питон
В Python 2 есть классы str
и unicode
. str
объекты хранят байты, unicode
объекты хранят символы UTF-16.Большинство библиотечных функций поддерживают и то, и другое (например, os.listdir('.')
возвращает список str
, os.listdir(u'.')
возвращает список unicode
объекты).У обоих есть encode
и decode
методы.
Python 3 в основном переименован unicode
Для str
.Python 3 эквивалентен str
был бы таким типом bytes
. bytes
имеет decode
и str
ан encode
способ. Начиная с Python 3.3 str
объекты внутренне используют одну из нескольких кодировок для экономии памяти.Для программиста на Python это все еще выглядит как абстрактная последовательность Unicode.
Поддержка Python:
- кодирование/декодирование
- нормализация
- простое преобразование регистра и разделение по пробелам
- поиск персонажей по их именам
Python не поддерживает / имеет ограниченную поддержку для:
- сопоставление (ограниченное)
- преобразования особого регистра, при которых нет сопоставления 1: 1 между символами нижнего и верхнего регистра
- регулярные выражения (над этим уже поработали)
- сегментация текста
- двунаправленная обработка текста
Смотрите также: Правда о Unicode в Python
JavaScript
Похоже, что до JS 1.3 не было поддержки Unicode. Начиная с 1.5 поддерживаются UTF-8, UTF-16 и UCS-2. Вы можете использовать escape-последовательности Unicode в строках, регулярных выражениях и идентификаторах. источник
.NET (C#, VB.NET, ...)
Магазины .NET струны внутренне как последовательность System.Char
Объекты.Один System.Char
представляет собой UTF-16 кодовая единица.
Из документации MSDN по System.Char
:
Платформа .NET Framework использует Обугливающийся структура для представления символа Unicode .Стандарт Unicode идентифицирует каждый символ Unicode с помощью уникального 21-разрядного скалярного числа, называемого кодовой точкой, и определяет UTF-16 форма кодирования, которая определяет, как кодовая точка кодируется в последовательность из одного или более 16-разрядных значений.Каждое 16-разрядное значение варьируется от шестнадцатеричного от 0x0000 до 0xFFFF и хранится в a Обугливающийся структура.
Дополнительные ресурсы:
- Строки в .NET и C# (автор - Джон Скит).
Tcl
Строки Tcl были последовательностями символов Юникода начиная с Tcl 8.1 (1999 г.). ). Внутренне они динамически преобразуются между UTF-8 (строго в том же Модифицированном UTF-8). как Java из-за обработки символов U + 00000
) и UCS-2 (конечно, в байтовом порядке хоста и спецификации). Все внешние строки (за одним исключением), в том числе используемые для связи с ОС, внутренне передаются в Юникоде, прежде чем преобразуются в ту кодировку, которая требуется для хоста (или настраиваются вручную на канале связи). Исключение составляют случаи, когда данные копируются между двумя каналами связи с общей кодировкой (и некоторыми другими ограничениями, которые здесь не актуальны), где используется прямая двоичная передача без копирования.
Символы вне BMP в настоящее время не обрабатываются ни внутренне, ни внешне. Это известная проблема.
Схема R6RS
Требуется реализация Unicode 5.1. Все строки в формате Unicode.
Ржавчина
Строки Rust ( std :: String
и & amp; str
) всегда являются допустимыми UTF-8 и не используют нулевые терминаторы, и в результате не могут быть индексируется как массив, как они могут быть в C / C ++, и т. д. Они могут быть нарезаны, как Go, используя .get
с 1.20, с оговоркой, что произойдет сбой, если вы попытаетесь нарезать середину кодовая точка.
Rust также имеет OsStr
/ OsString
для взаимодействия с ОС хоста. Это байтовый массив в Unix (содержащий любую последовательность байтов). В Windows это WTF-8 (супер-набор UTF-8, который обрабатывает неправильно сформированные строки Unicode, разрешенные в Windows и Javascript), & amp; str
и String
может быть свободно преобразован в OsStr
или OsString
, но требует проверки для скрытого преобразования другим способом. Либо из-за неверного Unicode, либо с заменой на символ замены Unicode. (Существует также Path
/ PathBuf
, которые являются просто обертками для OsStr
/ OsString
).
Существуют также типы CStr
и CString
, которые представляют строки C с нулевым символом в конце, например OsStr
в Unix, они могут содержать произвольные байты. р>
Rust напрямую не поддерживает UTF-16. Но можно конвертировать OsStr
в UCS-2 в Windows.
Objective-C
Нет встроенного, кроме того, что доступно как часть библиотеки C строк.
Однако, как только вы добавите рамки & # 8230;
Основа (Какао и касание какао) и Базовая основа
NSString и CFString каждый реализует полностью строковый класс на основе Unicode (фактически несколько классов, как деталь реализации). Эти два номера - & # 8220; платный мост & # 8221; так что API для одного можно использовать с экземплярами другого, и наоборот.
Для данных, которые не обязательно представляют текст, есть NSData и CFData. NSString предоставляет методы, а CFString предоставляет функции для кодирования текста в данные и декодирования текста из данных. Core Foundation поддерживает более сотни различных кодировок, включая все формы UTF. Кодировки делятся на две группы: встроенные кодировки , которые поддерживаются везде, и внешние кодировки , которые по крайней мере поддерживаются в Mac OS X.
NSString предоставляет методы для нормализации форм D, KD, C или KC. Каждый возвращает новую строку.
И NSString, и CFString предоставляют широкий спектр опций сравнения / сопоставления. Вот Флаги параметров сравнения Фонда и Флажки параметров сравнения Core Foundation . Они не все являются синонимами; например, Core Foundation по умолчанию делает буквальное (строгое на основе кода) сравнение, тогда как Foundation делает не буквальное сравнение (позволяя символам с акцентами сравниваться равными) по умолчанию.
Обратите внимание, что Core Foundation не требует Objective-C; действительно, он был создан в значительной степени для того, чтобы предоставить большинство возможностей Foundation программистам Carbon, которые использовали прямой C или C ++. Тем не менее, я подозреваю, что наиболее современное использование его в программах Cocoa или Cocoa Touch, которые все написаны на Objective-C или Objective-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
), но по крайней мере предпринимаются попытки получить что-то вроде < a href = "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3572.html" rel = "nofollow noreferrer"> поддержка юникода в стандартной библиотеке . р>
D
D поддерживает UTF-8, UTF-16 и UTF-32 (char, wchar и dchar соответственно). Таблицу со всеми типами можно найти здесь .
PHP
На SO в этом уже есть целая тема ! р>
рубин
Единственное, что я могу найти для Ruby, это довольно старый и не слишком рубист, я не уверен, насколько он точен.
Кстати, Ruby поддерживает utf8, но не многобайтовую. Внутренне обычно предполагается, что строки являются байтовыми векторами, хотя есть библиотеки и приемы, которые обычно можно использовать, чтобы заставить вещи работать.
Обнаружил, что здесь . р>
Ruby 1.9
Ruby 1.9 присоединяет кодировки к строкам. Двоичные строки используют кодировку «ASCII-8BIT». Хотя кодировкой по умолчанию обычно является UTF-8 в любой современной системе, вы не можете предполагать, что все функции сторонних библиотек всегда возвращают строки в этой кодировке. Он может вернуть любую другую кодировку (например, некоторые парсеры yaml делают это в некоторых ситуациях). Если вы объедините две строки различной кодировки, вы могли бы получить Encoding :: CompatibilityError
.
Lua
Lua 5.3 имеет встроенную библиотеку utf8
, которая обрабатывает кодировку UTF-8. Это позволяет вам преобразовать серию кодовых точек в соответствующую последовательность байтов и наоборот, получить длину (количество кодовых точек в строке), выполнить итерации по кодовым точкам в строке, получить позицию байта n th код. Он также предоставляет шаблон, который будет использоваться функциями сопоставления с образцами в библиотеке string
, который будет соответствовать одной последовательности байтов UTF-8.
Lua 5.3 имеет escape-последовательности кодовой точки Unicode, которые можно использовать в строковых литералах (например, " \ u {61} "
для " a "
). Они переводят в байтовые последовательности UTF-8.
Исходный код Lua может быть закодирован в UTF-8 или любой другой кодировке, в которой символы ASCII занимают один байт. UTF-16 и UTF-32 не поняты ванильным интерпретатором Lua. Но строки могут содержать любую кодировку или произвольные двоичные данные.