Технические вопросы и ответы QA1173

Текстовые кодировки в VFS

Q: Я пишу файловую систему (VFS) плагин для Mac OS X. Как я обрабатываю текстовые кодировки правильно?

A: Самые низкие уровни Mac OS X — который включает и уровень POSIX API и сменный KPI VFS — обрабатывают имена файлов, поскольку UTF-8 закодировал строки Unicode. Это повышает много интересных проблем.

Предварительно составленный по сравнению с анализируемым

Это Вопросы и ответы предполагают, что Вы знакомы с условиями предварительно составленный и анализируемый Unicode. Если это не так существует короткое объяснение в Технических Вопросах и ответах QA1235, 'Преобразовывая в Предсоставленный Unicode'.

Формат объема

Ваш целевой формат объема должен определить, использует ли он предварительно составленный или анализируемый Unicode. Например, HFS Плюс использование анализировал Unicode, тогда как UDF и SMB используют предсоставленный Unicode.

К сожалению, некоторые форматы объема (например, NFS) не имеют никакого принятого стандарта. Это представляет собой дополнительные проблемы, охваченные ниже.

Возврат имен

При возврате имен к более высоким уровням (например, от Вашего readdir работа vnode), необходимо возвратить анализируемые имена. Если бы Ваше базовое использование формата объема предварительно составило имена, то необходимо преобразовать любые предсоставленные символы в их анализируемые эквиваленты прежде, чем возвратить их системе.

Принятие имен

В большинстве случаев высокоуровневое программное обеспечение передаст анализируемые имена к Вашей файловой системе. Однако это не гарантируется. Существует множество обстоятельств (некоторые обсужденные ниже), куда Ваша файловая система передается предварительно составленные имена. Независимо от их входящего состояния необходимо всегда преобразовывать имена к схеме кодирования, требуемой базовым форматом объема. Таким образом, если Ваш базовый формат объема требует предварительно составленных имен, необходимо преобразовать имена к их предсоставленному варианту прежде, чем записать им в диск. Точно так же, если Ваш формат объема требует анализируемых имен, необходимо анализировать любые предсоставленные символы.

Это повышает вопрос того, что сделать, если Ваш базовый формат объема не определяет стандарт. Здесь нет никакого хорошего решения. Можно принять решение пройти через неизменные имена, который является тем, что реализация NFS Apple делает или предоставляет некоторый пользовательский интерфейс пользователю для выбора (подобный Кодированию, раскрывающемуся в окне Finder's Get Info для исходного HFS (Стандарт Mac OS) объема). Так или иначе пользовательский опыт не будет идеален.

Реализация

В пространстве пользователя просто преобразовать между предсоставленным и анализируемым Unicode; посмотрите Технические Вопросы и ответы QA1235, 'Преобразовав в Предсоставленный Unicode' для большего количества подробных данных о выполнении этого. Однако этот APIs не является вызываемым из ядра, где находится Ваш плагин VFS. К счастью, начиная с Mac OS X 10.5 ядро обеспечивает KPI для управления Unicode. Для получения дополнительной информации посмотрите различные подпрограммы, определенные в <sys/utfconv.h>, включая utf8_normalizestr.

Примечания совместимости

В теории методы, описанные выше, могут вызвать проблемы совместимости для приложений. Например, если приложение создаст файл с помощью предсоставленного имени и затем выполнит итерации через каталог, ища тот файл с помощью простого сравнения двоичной строки, то это не найдет файл. На практике это редко - проблема. Не забывайте, что основная файловая система, HFS Плюс, прокладывает себе путь, таким образом, любая программа, это является несовместимым с Вашей файловой системой, также будет несовместимой с HFS Плюс.

Большинство встроенных файловых систем Apple использует методы, описанные выше. Двумя существенными исключениями является NFS и UFS. Из них NFS является самым неприятным, потому что объемы NFS могут быть совместно использованы с неклиентами Mac, создающими файлы с предсоставленными символами на их имена и Mac OS X, клиент NFS не анализирует их прежде, чем возвратить их приложениям. Если пользователь копирует файлы от объема NFS до Вашего объема с помощью наивной программы копии (как cp инструмент командной строки), программа копии скопирует файлы, не анализируя имена. Таким образом Ваша файловая система будет спрошенным для создания файлов с предсоставленными именами. Ваша файловая система должна быть подготовлена обработать это, как описано выше.



История версии документа


ДатаПримечания
30.09.2011

Обновленный, чтобы описать последние методы и, в частности, рекомендовать использование <sys/utfconv.h> KPIs.

10.02.2003

Новый документ, объясняющий, как обработать текстовые кодировки правильно при записи файловой системы (VFS) плагин для Mac OS X.