Имена файлов Unicode на FAT-32?

Насколько я понимаю - NTFS поддерживает имена файлов Unicode (UTF-16, как утверждает Micorsoft?).

Однако официальная документация MSDN очень смутно в отношении того, какая кодовая страница используется для хранения имен файлов (пути к файлам) на FAT-32.

Здесь говорится, что OEM-страница кода (CP437, которую я предполагаю) используется для хранения имен файлов: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317748.aspx

Но здесь выясняется, что между CP437 могут быть разные кодовые страницы OEM: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752.aspx

И все мы теперь, что утилиты, такие как mount, поддерживают гораздо больше разных кодовых страниц для FAT, больше, чем только установленные кодовые страницы OEM.

Итак, какова фактическая cdepage для имен файлов FAT-32? Это зависит от кодовой страницы системы в то время, когда был создан объем FAT? Может ли FAT поддерживать настоящие двубайтовые кодировки символов, такие как UTF-16? Или многобайтовые кодировки символов, такие как UTF-8, являются лимитом?

И более конкретный вопрос: Что происходит, когда я использую функцию CreateFileW (которая, как утверждает MSDN, использует UTF-16 в качестве кодовой страницы имени файла), чтобы создать файл на томе FAT-32?

Ответ 1

Вам, возможно, придется экспериментировать здесь. Это отличный вопрос, и я не уверен на 100%, но:

Итак, какова фактическая кодовая страница для имен файлов FAT-32? Это зависит от кодовой страницы системы в то время, когда был создан объем FAT?

"Кодовая страница OEM", что бы это ни значило для системы.

Может ли FAT поддерживать настоящие кодовые страницы с символом двойного байта, такие как UTF-16? Или многобайтовые кодировки символов, такие как UTF-8, являются лимитом?

Нет, я не считаю, что FAT напрямую способен либо UTF-16, либо UTF-8. Тем не менее, Microsoft хранит имя файла Unicode в режиме вне диапазона. Таким образом, файл имеет два имени файла. (Так вы можете иметь более длинные имена файлов с именами 8.3.)

И более конкретный вопрос: что происходит, когда я использую функцию CreateFileW (которая, как утверждает MSDN, использует UTF-16 как кодовую страницу с именем файла), чтобы создать файл на томе FAT-32?

Имя файла Unicode, переданное в CreateFileW, хранится непосредственно в имени внеполосного файла. Он перекодируется в кодовую страницу OEM (независимо от того, что происходит в системе) и помещается туда. Если он не может быть преобразован в кодовую страницу OEM или превышает 8,3 символа, Windows вызовет файл примерно как FILENA~1.TXT.

Некоторые цитаты для ответов:

Во-первых, эта страница сообщает нам, что кодовая страница OEM!= кодовая страница Windows:

Не-Unicode-приложения, которые создают файлы FAT, иногда должны использовать стандартные функции преобразования библиотеки времени выполнения C для перевода между набором символов кодовой страницы Windows и набором символов кодовой страницы OEM. При реализации Unicode функций файловой системы нет необходимости выполнять такие переводы.

В типичной американской системе кодовая страница OEM "CP437" , но кодовая страница Windows Windows-1252 (FooA вызывает, я считаю, использование кодовой страницы Windows, как правило, Windows-1252 на американской машине, но зависит от языка).

Если у вас есть доступный объем FAT, вы можете увидеть это в действии. Символ "Σ" (U + 03a3) отсутствует в Windows-1252, однако он находится в CP437. Вы можете увидеть как короткие, так и длинные имена файлов с помощью dir /X. С файлом с именем asdfΣ.txt вы увидите:

ASDFΣ.TXT    asdfΣ.txt

Однако с файлом с именем "asdfΛ.txt" (Λ отсутствует в CP437 или Windows-1252), вы увидите:

ASDF~1.TXT   asdf?.txt

(Вероятно, вы увидите ?, потому что шрифт cmd.exe не может отображать Λ.)

Информацию о длинных именах файлов см. в этой статье в Википедии.

Кроме того, интересно, если вы назовете файл "asdf ©.txt", вы можете получить:

ASDFC.TXT    asdfc.txt

... Я не уверен на 100% здесь, но я думаю, что Windows ловко решила заменить "c" на © и сделала то же самое для его отображения. Если вы измените шрифт на то, что не основано на растре, например Consolas, вы увидите:

ASDFC.TXT    asdf©.txt

Вот почему вы должны использовать функции FooW.

Ответ 2

Основные записи каталога FAT или FAT32 поддерживают только короткие имена (старый формат DOS 8.3) в текущей кодовой странице OEM. Однако VFAT (FAT с поддержкой длинных имен файлов), который используется под Windows, может хранить дополнительное, так называемое длинное имя файла для каждого файла, в UTF-16.