«Windows использует UTF-16 в качестве своей внутренней кодировки», что именно это означает?

#windows #encoding #utf-8

#Windows #кодирование #utf-8

Вопрос:

Извините, если вопрос глупый, он меня немного смутил, предположим, у меня есть приложение (неважно, C, C , .NET или Java) на моей Windows XP, и это приложение будет получать данные с удаленного компьютера, данные содержат китайские символы, теперь, если китайские символы становятся ненужнымиправильно ли говорить, что Windows не имеет никакого отношения к этой проблеме? потому что Windows использует UTF-16 и может правильно обрабатывать китайские символы.

С другой стороны, предположим, что Windows использует ASCII в качестве своей внутренней кодировки, означает ли это, что любые приложения на нем никогда не смогут правильно отображать китайские символы?

Заранее спасибо.

Комментарии:

1. как говорится, «внутренняя кодировка» — это говорит только о самой Windows… что бы ваше приложение ни делало или не делало, полностью зависит от приложения!

Ответ №1:

Ядро Windows NT использует UNICODE_STRING для многих (или большинства?) Именованных объектов (например, файлов). Кодировка — UTF-16.

Многие вызываемые API-интерфейсы пользовательского режима предоставляют пары почти идентичных функций, где одна из пары принимает строки Unicode, а другая — строки ANSI. Строковые версии ANSI в конечном итоге преобразуют имена из ANSI в Unicode.

Например, когда вы вызываете функцию C fopen(), которая принимает 8-разрядные имена файлов, отличные от Юникода, она в конечном итоге вызывает CreateFileA() (ANSI) , и это в конечном итоге вызывает NtCreateFile() , который принимает имена файлов в Юникоде. Один из параметров NtCreateFile(), структура OBJECT_ATTRIBUTES, содержит указатель на структуру UNICODE_STRING .


Если вы, с другой стороны, вызовете функцию _wfopen() MSVC , она достигнет NtCreateFile() через CreateFileW() (Unicode) без преобразования.

Комментарии:

1. Это UTF-16 или UCS-2? UTF-16 включает последовательности для представления символов, превышающих 0xFFFF; UCS-2 является чисто 16-разрядным. На указанной веб-странице не указано. (В нем также говорится о том, что строка «завершается нулем», но NULL является константой нулевого указателя .)

2. @Keith Thompson: функции Rtl * string сравнивают байты, а не кодовые точки, но ядро все равно не заботится о кодировках. Кроме того, документация пытается сказать, что UNICODE_STRINGs не обязательно завершается нулем (с нулевым значением (WCHAR)0), и что поле длины никогда не включает в себя нулевой терминатор, если он присутствует.

3. @wj32: дело в том, что «с нулевым завершением» неверно; «с нулевым завершением» было бы правильным. (Я отправил им электронное письмо; посмотрим, поможет ли это.)

4. @Keith Thompson: Существует константа с именем UNICODE_NULL, поэтому они могут ссылаться на это.

5. @KeithThompson: я не думаю, что существует большая потребность и полная поддержка Unicode везде в Windows, например, NTFS не пытается придать смысл именам файлов и не проверяет их : NTFS allows any sequence of 16-bit values for name encoding (file names, stream names, index names, etc.). This means UTF-16 codepoints are supported, but the file system does not check whether a sequence is valid UTF-16 (it allows any sequence of short values, not restricted to those in the Unicode standard).

Ответ №2:

Чтобы сохранить любой текст в памяти и отобразить его на экране, ОС должна обрабатывать этот текст в некоторой кодировке за кулисами. Какая именно кодировка не должна иметь для вас значения. Насколько вы знаете, он может обрабатывать его как кодированный ASCII в формате HTML, если API принимают определенный текст и выводят правильные данные.

«Windows использует UTF-16 внутренне» означает, что Windows хранит и обрабатывает текст внутри как UTF-16. Он также поддерживает китайский текст. Эти две вещи не обязательно связаны. Да, внутреннее использование UTF-16 упрощает поддержку китайского языка, вероятно, поэтому инженеры Windows решили использовать UTF-16.

Комментарии:

1. Хорошо, спасибо. Итак, все зависит от приложения и не имеет ничего общего с ОС, верно? Как насчет региональных и языковых параметров (которые можно найти в панели управления Windows)? Вызовет ли этот параметр какие-либо проблемы с нежелательными символами?

2. Зависит от вашего приложения. Существует параметр, который определяет, как должны вести себя устаревшие приложения, которые не используют Unicode. Если ваше приложение правильно обрабатывает себя, ни один из этих параметров не должен иметь значения. Я не могу сказать больше, поскольку я действительно не программист Windows.

3. Почему Microsoft не использует UTF-32, поэтому он поддерживает все символы? Например, UTF-16 не может содержать все символы, которые есть в Unicode 13.0.0, например — верно? (Я читал об этом и надеюсь, что я не задаю глупый вопрос, ха-ха) Из того, что я получил от этого, для поддержки всех символов Windows UTF-32. Или нет? Или он может использовать UTF-16 или UTF-8 и использовать like u4356 u2349 для представления 32-битного символа?