Каковы ограничения типов примитивных характеров в D?

В настоящее время я изучаю спецификацию Digital Mars D, и я немного затрудняюсь понять всю природу примитивного персонажа типы. Книга Learn to Tango With D также смутно описывает возможности и ограничения языка в этой области.

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Дальнейшее чтение: