2015-08-08 3 views
1

Я написал приложение, которое предпочитает NFC. Когда я получаю имя файла из OSX, его нормализует как NFD. Насколько я знаю, что не должен преобразовать данные, как его упомянутые здесь:Нормализовать имена файлов в NFC или нет (Unicode)

http://www.win.tue.nl/~aeb/linux/uc/nfc_vs_nfd.html

[...] (Не потому, что что-то не так с NFD, или этой версии NFD, но потому что один никогда не должны изменять данные. Имена файлов не должны быть нормированный.) [...]

Когда я сравниваю имя файла с пользовательского ввода (который находится в NFC) я должен реализовать соответствующую функцию сравнения, которая заботится об эквивалентности Unicode. Но это может быть намного медленнее, чем нужно. Было бы лучше, если бы я нормализовал имя файла в NFC вместо этого? Это значительно улучшит скорость, когда будет задействовано только сравнение памяти.

ответ

3

Точность рекомендаций, на которые вы ссылаетесь, зависит от рассматриваемой файловой системы.

Стандартные файловые системы Linux не предписывают кодировку имен файлов (они рассматриваются как необработанные байты), поэтому, если они являются UTF-8 и нормализация их является ошибкой и может вызвать проблемы.

С другой стороны, файловая система по умолчанию в Mac OS X (HFS +) обеспечивает включение всех имен файлов в UFF-16 в варианте NFD. Если вам нужно сравнить пути к файлам, вы должны сделать это в аналогичном формате - в идеале, используя API, предоставляемые системой, поскольку его форма NFD привязана к более ранней версии Unicode.

+0

Вы говорите, что HFS + принудительно вводит все имена файлов в соответствие с NFD UTF-16. Почему следующий код сохраняет исходную кодовую точку? Как вы можете видеть из моего другого вопроса (http://stackoverflow.com/questions/31899371/normalization-does-not-preserve-code-point/31900297#31900297) любое преобразование из Ом в любую другую нормальную форму приводит к U + 03a9 , 'os.mkdir (u" \ u2126 "); для г в os.listdir (». "): печать (магнезии (я), магнезии (i.decode (sys.getfilesystemencoding()))) ' Выход: ' (" '\\ XE2 \\ x84 \\ xa6 '"," u' \\ u2126 '")' – HelloWorld

+0

Итак, вместо того, чтобы преобразовывать имена файлов в NFC, я должен преобразовать другую строку в целевую форму нормализации? Предположим, что поле ввода пользователя для имен файлов должно быть преобразовано в UTF-16 (NFD) вместо этого, чтобы обеспечить правильное сравнение? – HelloWorld

+2

HFS + использует вариант NFD, описанный в [этой таблице] (https://developer.apple.com/legacy/library/technotes/tn/tn1150table.html). Обратите внимание, что 'U + 2126' не отображается в этой таблице; но если вы попробуете свой пример с 'U + 037E', вы замените его на' U + 003B'. –

Смежные вопросы