Подтвердить что ты не робот

Нормализация Unicode в Windows

Я использую "строки Unicode" в Windows до тех пор, пока... Я узнал о Unicode (например, после окончания). Однако всегда меня удивляло, что Win32API очень сильно упоминает "unicode". В частности, вариант Unicode, упомянутый MSN, - UTF-16 (хотя терминология "широкая char" исходит из того, что она была UCS-2, которая не является Unicode). Однако он почти не упоминает о нормализации Unicode.

MSN имеет несколько страниц о Unicode и Unicode Normalization Forms и функции изменить форму нормализации. Страница нормализации даже говорит:

Win32 и .NET Framework поддерживают все четыре формы нормализации.

Однако я не нашел нигде в документах, какая форма нормализации используется (или понимается) с помощью Win32 API.

Вопрос 1: какая форма нормализации используется по умолчанию для ввода пользователя (например, элемент управления Edit) и преобразования через MultiByteToWideChar()?

Вопрос 2: должны ли строки, переданные функциям Win32API, в определенной форме нормализации, или нормализация ядра и файловой системы - агностик?

4b9b3361

Ответ 1

Из статьи MSDN Использование нормализации Unicode для представления строк.

Windows, приложения Microsoft и .NET Framework обычно генерируют символы в форме C, используя обычные методы ввода. Для большинства целей в Windows форма C является предпочтительной. Например, символы в форме C производятся с помощью ввода клавиатуры Windows. Однако символы, импортированные из Интернета и других платформ, могут вводить в поток данных другие формы нормализации.

Обновление: Я включил некоторые конкретные детали, относящиеся к Вопросу №2.

В отношении файловой системы нормализация не требуется - на основе статьи Именование файлов, путей и пространств имен.

Нет необходимости выполнять какую-либо нормализацию Unicode в строках пути и имени файла для использования с помощью функций API ввода-вывода файлов Windows, поскольку файловая система рассматривает пути и имена файлов как непрозрачную последовательность WCHAR. Любая нормализация, требуемая вашим приложением, должна выполняться с учетом этого, вне любых вызовов связанных функций API ввода-вывода файлов Windows.

Что касается SQL Server, нормализация не требуется - и данные не нормализуются при сохранении в базе данных. Тем не менее, при сравнении строк SQL Server 2000 использует свой собственный механизм нормализации строки внутри индексов; но я не могу найти конкретных подробностей о том, что это такое. В статье SQL Server 2005 указано то же.

Одним из важных изменений в SQL Server 7.0 было предоставление независимой от операционной системы модели для сравнения строк, поэтому сопоставление между всеми операционными системами от Windows 95 до Windows 2000 было бы последовательным. Этот код сравнения строк был основан на том же коде, который Windows 2000 использует для своей собственной нормализации строки, и инкапсулирован как один и тот же на всех компьютерах и во всех версиях SQL Server.

Ответ 2

какая форма нормализации используется по умолчанию для ввода пользователем

Зависит от раскладки клавиатуры /IME. Можно создать нормальную форму C, D или сумасшедшую смесь обоих, если вы хотите.

Раскладки клавиатуры имеют тенденцию к NFC, потому что в дни до Юникода они обычно выводили одиночный байтовый символ на местной кодовой странице для каждого нажатия клавиши. Однако есть исключения.

Например, с использованием вьетнамской раскладки клавиатуры Windows некоторые диакритики вводятся в виде одного нажатия клавиши в сочетании с буквой (например, circumflex â), а некоторые набираются как комбинированные диакритические (например, серьезные ). Графе a-с-circumflex-and-grave будет набираться как a-circumflex с последующим объединением-могилой, ầ, которая будет 0xE2,0xCC на вьетнамском кодовом стр. 1258, и выйдет как U + 00E2, U +0300 в Юникоде.

Это не в нормальной форме C (которая была бы U + 1EA7 латинская маленькая буква A с округлой и тяжелой), а не D (которая была бы ầ U + 0061, U + 0302, U + 0300).

Как правило, предпочтение отдается NFC в мире Windows и в Интернете, а также для NFD в мире Apple. Но это не строго соблюдается, и вы должны ожидать, что справитесь с любой комбинацией комбинированных и разложимых символов.

- нормализация ядра и файловой системы - агностик?

Да, ядро ​​и файловая система ничего не знают о нормализации и вполне счастливо позволят вам иметь файлы с именами ầ.txt, ầ.txt и ầ.txt в той же папке.

Ответ 3

Прежде всего, спасибо за отличный вопрос. Я нашел ответ в блог Майкла Каплана:

Но поскольку все методы ввода текста в Windows имеют тенденцию использовать ту же форму нормализации (форма C),...