Каковы ограничения типов примитивных характеров в 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 Кристофера Э. Миллера.
Дальнейшее чтение: