Нормализация Юникода в Windows - PullRequest
22 голосов
/ 12 августа 2011

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

MSN имеет несколько страниц о Юникод и Формы нормализации Юникода и функции на изменяют форму нормализации . Страница о нормализации даже говорит:

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 13 августа 2011

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

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

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

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

Нет необходимости выполнять какую-либо нормализацию Юникода для путей и строк имен файлов для использования функциями 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.

9 голосов
/ 13 августа 2011

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

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

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

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

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

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

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

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

2 голосов
/ 12 августа 2011

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

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

...