Имена файлов Unicode в Windows и Mac OS X

1527
PaulJ

Я пытался использовать несколько программ синхронизации файлов Windows (Microsoft SyncToy, FreeFileSync) для синхронизации между двумя папками: локальной папкой Windows и папкой OS X, смонтированной на машине Windows с помощью WebDAV. Однако синхронизация работала не слишком хорошо: всякий раз, когда в имени файла использовались необычные символы (акценты, китайские буквы ...), программа не обнаруживала его как один и тот же файл и пыталась скопировать его двумя способами: сначала с Коробка Windows для OS X одна, а потом и другая. По сути, он рассматривал 2 копии файла как совершенно разные.

Это заставило меня задуматься: какие именно варианты между Unicode используются для имен файлов в OS X и Windows? (Я полагаю, что все они поддерживают Unicode к настоящему времени). Что можно сделать, чтобы предотвратить несовместимости этого типа?

Две машины используют Windows 7 SP 1 и OS X 10.9.5.

1

1 ответ на вопрос

2
hippietrail

Windows использует UTF-16. Большинство кодовых точек кодируются двумя байтами. Кодовые точки вне BMP (базовой многоязычной плоскости) кодируются в «суррогатную пару», которая занимает четыре байта. Windows не нормализует имена файлов, используя любую форму нормализации Unicode.

Это означает, что у вас может быть два имени файла, которые выглядят одинаково с одним, используя предварительно составленное «é», состоящее из одной кодовой точки, а другое - с помощью обычного ASCII «e», за которым следует Unicode, сочетающий острый акцент, то есть две кодовые точки.

OS X использует UTF-8. Кодовые точки кодируются с использованием от одного до пяти байтов. OS X использует Unicode NFD (форма нормализации канонического разложения).

Это означает, что когда в имени файла используется символ Unicode, такой как «é», он всегда будет нормализован системой в обычный ASCII «e», за которым следует Unicode, сочетающий острый акцент, и всегда будет принимать две кодовые точки.

Фактически OS X использует спецификацию Unicode NFD от Unicode версии 2.1 или 3.2, в зависимости от версии OS X.

Вот хорошая страница, которая охватывает тонкости в кодировке имени файла OS X's / HFS +.