Существует ли язык программирования с полной и правильной поддержкой Юникода?

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


Примеры

Java: reverse () в StringBuilder / StringBuffer работают правильно. Но length (), charAt () и т. Д. В String этого не делают, если символу требуется более 16 бит для кодирования.

C #: Не найден правильный обратный метод. Длина и индексированный доступ возвращают неверные результаты.

Perl: Та же проблема.

PHP: У меня вообще нет идеи Unicode, у mbstring есть несколько лучших рабочих замен.


Интересно, есть ли язык программирования, который имеет полную и правильную поддержку Unicode? Какие компромиссы должны были быть достигнуты для достижения такой цели?

  • Более сложные алгоритмы?
  • Более высокое потребление памяти?
  • Более низкая производительность?

Как это было реализовано внутри?

  • Массив целых, связанных списков и т. Д.
  • Дополнительная буферизация

Я видел, что в Python 3 произошли довольно большие изменения в этой области. Насколько близок Python 3 к правильной реализации?

8
задан soc 24 July 2010 в 14:14
поделиться

6 ответов

Похоже, Perl 6 имеет хорошую поддержку Unicode:

perlgeek.de/en/article/5-to-6#post_17

Например, он предоставляет вам три разных длины методы:

  • байты (количество байтов)
  • коды (количество кодовых точек)
  • графики (количество графем)

Это также интегрируется в регулярные выражения Perl.

Для меня это шаг в правильном направлении.

4
ответ дан 5 December 2019 в 06:22
поделиться

В Python 3 строки всегда являются юникодом (есть bytes для ASCII или подобных кодировок). Я не знаю ни об одном встроенном модуле, работающем с ними некорректно. Может быть, они и есть, но, учитывая, что он вышел довольно давно, я полагаю, что они получили примерно все необходимое для ежедневной работы.

Конечно, Unicode потребляет больше памяти (UTF-8 не очень, если вы остаетесь в пределах ASCII, но в остальном...), и я могу себе представить, что кодировки с несколькими длинами - это боль для внутренней обработки. Однако я ничего не знаю о реализации. За исключением того, что это не может быть связанный список, поскольку он имеет O(1) случайный доступ.

5
ответ дан 5 December 2019 в 06:22
поделиться

Реализация Java корректна в том смысле, что не нарушает стандарт Unicode; нет предписания, чтобы индексация строк работала на кодовых точках вместо кодовых единиц, и поведение документировано. Стандарт Unicode дает реализаторам большую свободу в отношении оптимизации, пока не происходит утечка недопустимых строк. Что касается "полной поддержки", то это еще сложнее определить. Стандарт Unicode обычно не требует, чтобы определенные функции были реализованы, чтобы быть совместимыми с Unicode; только то, что функции, которые реализованы, реализованы в соответствии со стандартом. Огромные части, касающиеся обработки шрифтов, относятся к шрифтам или операционной системе, которые системы программирования не могут контролировать. Если вы хотите судить о поддержке Unicode определенными технологиями, вы можете начать с проверки следующего (субъективного и неполного) списка тем:

  • Есть ли в системе строковый тип данных, использующий кодировку Unicode?
  • Поддерживаются ли все кодировки Unicode (UTF), описанные в стандарте?
  • Нормализация
  • Двунаправленный алгоритм
  • Является ли UpperCase("ß") = "SS"?
  • Зависит ли верхний регистр от локали? (например, в турецком языке UpperCase("i") = "İ")
  • Есть ли функции для работы с кодовыми точками вместо кодовых единиц?
  • Регулярные выражения Unicode
  • Вызывает ли система исключения, когда при декодировании встречаются недопустимые последовательности кодовых единиц?
  • Доступ к свойствам базы данных Unicode?

Я думаю, что Java и .NET отвечают на эти вопросы в основном "да", а Python 3.x - почти всегда "нет"

.
9
ответ дан 5 December 2019 в 06:22
поделиться

.NET Framework хранит данные char и string с использованием кодировки UTF-16. Если вы предположите , что весь ваш текст находится в пределах базовой многоязычной плоскости, тогда все будет работать без какого-либо специального кода.

Если вы считаете введенные пользователем строки большими двоичными объектами и не пытаетесь ими манипулировать (например, большинство текстовых полей в приложениях CRUD), тогда ваш код будет отображаться для правильной обработки символов вне BMP, потому что UTF-16 хранит их как суррогатные пары. Пока вы не возитесь с суррогатными парами, все будет в порядке.

Однако, если вы хотите анализировать и манипулировать строками, а также правильно обрабатывать символы вне BMP, вам необходимо явно указать код для этой возможности. См. В классе StringInfo методы, которые помогут вам обрабатывать суррогатные пары.

Я предполагаю, что Microsoft разработала это таким образом, чтобы достичь баланса между производительностью и правильностью. Возможны следующие варианты:

  • Хранить строки как UTF-32 - низкая производительность с точки зрения использования памяти
  • Заставить все строковые функции обрабатывать суррогатные пары - очень низкая производительность для манипуляций

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

1
ответ дан 5 December 2019 в 06:22
поделиться

Я считаю, что любой язык, поддерживаемый в .NET framework , имеет правильную поддержку юникода (UTF-16).

Также аналогичный вопрос здесь

0
ответ дан 5 December 2019 в 06:22
поделиться

Go , новый язык, разработанный в Google, изобретенный Кеном Томпсоном и Робом Пайком , а также диалект C в Plan9 ] из Bell Labs были созданы с учетом Unicode ( UTF-8 был изобретен там, в Bell Labs, Кеном Томпсоном).

7
ответ дан 5 December 2019 в 06:22
поделиться