Каковы ограничения примитивных типов символов в D? - PullRequest
13 голосов
/ 12 июля 2009

В настоящее время я изучаю спецификацию языка Digital Mars D , и у меня возникли небольшие проблемы с пониманием всей природы примитивных типов символов. Книга «Учись танго с D» 1004 * так же неопределенна в отношении возможностей и ограничений языка в этой области.

Типы указаны на веб-сайте как:

char;    // unsinged 8 bit UTF-8
wchar;   // unsigned 16 bit UTF-16
dchar;   // unsigned 32 bit UTF-32

Поскольку мы знаем, что большинство кодировок формата Unicode Transformation (UTF) представляют символы с переменной битовой шириной, означает ли это, что символ в D может содержать только те значения, которые уместятся в 8 бит, или расширяется в физической памяти машины, когда вы даете ему двухбайтовые символы? Возможно, есть какая-то другая возможность, например, автоматическое приведение к следующему наиболее подходящему типу при перегрузке переменной?

Скажем, например, я хочу использовать символ UTF-8 в редакторе и печатать на китайском языке. Будет ли он просто падать, или он будет работать с символами Unicode более «правильно», как в C #? Будет ли по-прежнему необходимо указывать код для работы с любым языком, поддерживаемым Unicode?

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

1 Ответ

15 голосов
/ 12 июля 2009

Один char или wchar представляет кодовую единицу UTF . Это означает, что само по себе char in может либо представлять символ ASCII (0-127), либо быть частью последовательности UTF-8, представляющей символ Unicode ( кодовая точка ). Только тип dchar может представлять весь символ Unicode, поскольку в Unicode более 65536 кодовых точек.

Приведение одного типа строкового типа (string, wstring и dstring, которые являются просто динамическими массивами типов символов) не будет автоматически преобразовывать их содержимое в соответствующее представление UTF. Для этого необходимо использовать функции toUTF8, toUTF16 и toUTF32 из std.utf (или toString / toString16 / toString32 из tango.text.convert.Utf, если вы используете танго).

Пользователи внедрили строковые классы, которые будут автоматически использовать наиболее эффективное представление памяти, которое может отображать каждый символ в одну единицу кода. Это позволяет быстро нарезать и индексировать с минимальными затратами памяти. Одной из таких реализаций является mtext от Кристофера Миллера.

Дополнительное чтение:

...