Поддержка Unicode на различных языках программирования

StackOverflow https://stackoverflow.com/questions/1036585

  •  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 Обугливающийся структура.

Дополнительные ресурсы:

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.

Common Lisp (SBCL и CLisp)

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

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 .

Arc

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

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. Но строки могут содержать любую кодировку или произвольные двоичные данные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top