Большинство языков программирования имеют некоторую поддержку Unicode, но у всех есть более или менее документированные угловые случаи, когда вещи не будут работать правильно.
Примеры
Java: reverse () в StringBuilder / StringBuffer работают правильно. Но length (), charAt () и т. Д. В String этого не делают, если символу требуется более 16 бит для кодирования.
C #: Не найден правильный обратный метод. Длина и индексированный доступ возвращают неверные результаты.
Perl: Та же проблема.
PHP: У меня вообще нет идеи Unicode, у mbstring есть несколько лучших рабочих замен.
Интересно, есть ли язык программирования, который имеет полную и правильную поддержку Unicode? Какие компромиссы должны были быть достигнуты для достижения такой цели?
Как это было реализовано внутри?
Я видел, что в Python 3 произошли довольно большие изменения в этой области. Насколько близок Python 3 к правильной реализации?
Похоже, Perl 6 имеет хорошую поддержку Unicode:
perlgeek.de/en/article/5-to-6#post_17
Например, он предоставляет вам три разных длины методы:
Это также интегрируется в регулярные выражения Perl.
Для меня это шаг в правильном направлении.
В Python 3 строки всегда являются юникодом (есть bytes
для ASCII или подобных кодировок). Я не знаю ни об одном встроенном модуле, работающем с ними некорректно. Может быть, они и есть, но, учитывая, что он вышел довольно давно, я полагаю, что они получили примерно все необходимое для ежедневной работы.
Конечно, Unicode потребляет больше памяти (UTF-8 не очень, если вы остаетесь в пределах ASCII, но в остальном...), и я могу себе представить, что кодировки с несколькими длинами - это боль для внутренней обработки. Однако я ничего не знаю о реализации. За исключением того, что это не может быть связанный список, поскольку он имеет O(1) случайный доступ.
Реализация Java корректна в том смысле, что не нарушает стандарт Unicode; нет предписания, чтобы индексация строк работала на кодовых точках вместо кодовых единиц, и поведение документировано. Стандарт Unicode дает реализаторам большую свободу в отношении оптимизации, пока не происходит утечка недопустимых строк. Что касается "полной поддержки", то это еще сложнее определить. Стандарт Unicode обычно не требует, чтобы определенные функции были реализованы, чтобы быть совместимыми с Unicode; только то, что функции, которые реализованы, реализованы в соответствии со стандартом. Огромные части, касающиеся обработки шрифтов, относятся к шрифтам или операционной системе, которые системы программирования не могут контролировать. Если вы хотите судить о поддержке Unicode определенными технологиями, вы можете начать с проверки следующего (субъективного и неполного) списка тем:
UpperCase("ß") = "SS"
?UpperCase("i") = "İ"
)Я думаю, что Java и .NET отвечают на эти вопросы в основном "да", а Python 3.x - почти всегда "нет"
. .NET Framework хранит данные char
и string
с использованием кодировки UTF-16. Если вы предположите , что весь ваш текст находится в пределах базовой многоязычной плоскости, тогда все будет работать без какого-либо специального кода.
Если вы считаете введенные пользователем строки большими двоичными объектами и не пытаетесь ими манипулировать (например, большинство текстовых полей в приложениях CRUD), тогда ваш код будет отображаться для правильной обработки символов вне BMP, потому что UTF-16 хранит их как суррогатные пары. Пока вы не возитесь с суррогатными парами, все будет в порядке.
Однако, если вы хотите анализировать и манипулировать строками, а также правильно обрабатывать символы вне BMP, вам необходимо явно указать код для этой возможности. См. В классе StringInfo методы, которые помогут вам обрабатывать суррогатные пары.
Я предполагаю, что Microsoft разработала это таким образом, чтобы достичь баланса между производительностью и правильностью. Возможны следующие варианты:
.NET также содержит полную поддержку преобразования регистра, сравнения и сортировки с учетом языка и региональных параметров.
Я считаю, что любой язык, поддерживаемый в .NET framework , имеет правильную поддержку юникода (UTF-16).
Также аналогичный вопрос здесь
Go , новый язык, разработанный в Google, изобретенный Кеном Томпсоном и Робом Пайком , а также диалект C в Plan9 ] из Bell Labs были созданы с учетом Unicode ( UTF-8 был изобретен там, в Bell Labs, Кеном Томпсоном).