LINUX.ORG.RU

Кодировка файлов на FAT32

 , , ,


0

1

Флешка имеет формат FAT32

На машине Debian 12 локаль unicode:

# echo $LANG
ru_RU.UTF-8

Монтирую командой

# mount /dev/sdb /media/flash -o uid=1000,gid=1000,iocharset=utf8,utf8

В ядре

# grep CONFIG_FAT_DEFAULT_IOCHARSET /boot/config-$(uname -r)
CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
# grep FAT_DEFAULT_UTF8 /boot/config-$(uname -r)
CONFIG_FAT_DEFAULT_UTF8=y

(и как это поменять не пересобирая ядро я не знаю)

а директория у меня выводится ‘Ð’$‘\302\232''ниги’ вместо Книги

Слово «Книги» в кодировке UTF-8 представляется следующими байтами: К: D0 9A н: D0 BD и: D0 B8 г: D0 B3 и: D0 B8 В шестнадцатеричном представлении это будет: D0 9A D0 BD D0 B8 D0 B3 D0 B8

Если эти байты интерпретировать как ISO-8859-1 (или Windows-1252), то каждый байт будет преобразован в символ, который не соответствует оригинальному символу. Например:

D0 в ISO-8859-1 интерпретируется как Ð
9A в ISO-8859-1 интерпретируется как š (но в данном случае это не используется, так как это не соответствует байтам UTF-8)
B8 в ISO-8859-1 интерпретируется как ¸ (также не используется)
и так далее для остальных байтов.

Что ей не так?
Как сделать, чтобы заработало?

★★★★

Последнее исправление: Shushundr (всего исправлений: 3)
Ответ на: комментарий от Ygor

Это я уже перепробовал всё в разных вариантах. Мне кажется, что она на флешке уже в UTF8 записано.

Shushundr ★★★★
() автор топика
Ответ на: комментарий от ALiEN175

Оно не сработало. И в моём понимании и не должно было.

Shushundr ★★★★
() автор топика

Файлы в файловую систему как были записаны? Насколько я помню, fat32 не поддерживает многобайтовые кодировки. Всё что можно сделать это указать кодировку, в которой записываются имена на диск и кодировку, которая используется в системе(в которой поступают запросы от приложений). Об этом рассказано в man mount

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)
Ответ на: комментарий от cobold

Файлы в файловую систему как были записаны?

Ну, это была флешка, я воткнул её в роутер, там стояла OpenWrt 23.05.4, я расшарил там smb шару, и на шару записал директорию с русским именем.

Потом флешку вынул, вставил в комп, а имя - закодированное!

Если вставить обратно в роутер, то в шаре снова видно в нормальной кодировке.

Shushundr ★★★★
() автор топика
Ответ на: комментарий от Shushundr

А, то есть там имена по дороге ещё и в самбе могли быть сконвертированы. Теперь смотри настройки самбы и монтирования в openwrt и пробуй провернуть фарш из байтов в обратную сторону

cobold ★★★★★
()

Вы какой-то ерундой занимаетесь. В FAT32 имена файлов всегда в кодировке UTF-16. Правильная опция монтирования — utf8 и всё. Всякие iocharset и так далее устарели, могут пригодиться только если локаль в системе не UTF-8, а например koi8-r.

CONFIG_FAT_DEFAULT_UTF8=y

Значит опций монтирования вообще не нужно указывать, utf8 подставляется и так.

а директория у меня выводится ‘Ð’$‘\302\232''ниги’ вместо Книги

Это потому что эта директория реально так и называется. Переименуй её и всё.

Ну, это была флешка, я воткнул её в роутер, там стояла OpenWrt 23.05.4, я расшарил там smb шару, и на шару записал директорию с русским именем.

Видимо, как раз в OpenWrt опции CONFIG_FAT_DEFAULT_UTF8=y нет. Пересобери там ядро или найди где её вкорячить.

Если там реально много файлов с русскими именами — примени какую-нибудь утилиту массового переименования со сменой кодировки. Я помню что были такие, одна из них вроде называлась recode. Или воткни в роутер USB-хаб, смонтируй одну флешку с дефолтными опциями, а другую, пустую, с опцией utf8 и перекинь на неё все файлы.

PS. Если хочешь именно в дебиане вернуть имена, то опция должна быть то ли utf8=no или utf8=false, как-то так и затем уже iocharset=xxx подбирать. Но учти что это неправильные опции монтирования и проблема в настройках OpenWrt, а не дебиана.

PPS. Тебе нужно смонтировать флешку с utf8=no,iocharset=iso8859-1 переместить файлы на комп, затем смонтировать без опций и переместить обратно.

Я специально поиздевался над своей флешкой и подобрал опции, чтобы воспроизвести твои крокозябры, хотя по идее ты сам должен был это делать.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 9)
Ответ на: комментарий от Xenius

В FAT32 имена файлов всегда в кодировке UTF-16.

Ты с exFat или NTFS не попутал? Fat32 появилась в win95, в который не были реализованы юнмкодные функции win32 api

cobold ★★★★★
()
Последнее исправление: cobold (всего исправлений: 1)
Ответ на: комментарий от cobold

Я больше скажу - и в FAT16 длинные имена в utf-16. Несмотря на то, что появилась она вроде бы во втором досе.

не были реализованы юнмкодные функции win32 api

Мне лень проверять, но было бы очень странным реализовывать MessageBoxA но при этом не делать MessageBoxW. Зачем тогда буква A там вообще?

В любом случае, файловая система гуи-функциями не пользуется и может и без них.

firkax ★★★★★
()

Автор, найди на флешке кластер с этой родительской к этой директорией и сделай ему hexdump -C. Посмотрим что там.

А вообще если много таких названий можно сделать скрипт который через iconv их переименует. Я так делал когда zip с не пойми какой кодировкой распаковывал.

firkax ★★★★★
()
Ответ на: комментарий от cobold

Нет, не осознаешь что-то ты. Эту декорацию имён (A, W) сделали как раз потому, что функций было два вида. Если бы не это, сделали бы просто MessageBox без суффиксов, но в win32 api изначально заложена поддержка 16-битных символов была.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Полноценная реализация была в NT. В Win9x большинство юникодных функций были нереализованы.

MessageBoxW, кстати, это одна из немногих юникодных функций, которая была реализована в Win9x.

bigbit ★★★★★
()
Ответ на: комментарий от firkax

Нет, не осознаешь что-то ты. Эту декорацию имён (A, W) сделали как раз потому, что функций было два вида.

Ага с этим ты вроде разобрался. Идём дальше.

В любом случае, файловая система гуи-функциями не пользуется и может и без них

А причем здесь гуи-функции? CreateFile и CreateFileEx точно так же существуют в A и W вариантах https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew

cobold ★★★★★
()
Ответ на: комментарий от cobold

Ага с этим ты вроде разобрался

Прекращай тупить. Разбираться надо тебе, а я эти функции видел/использовал около много лет назад и побайтовое устройство dos/win файловых систем (кроме ntfs) видел и кодил под него ещё больше лет назад.

А причем здесь гуи-функции? CreateFile и CreateFileEx точно так же существуют в A и W вариантах

Это всё не важно, это юзерское апи. А на диск пишет драйвер файловой системы. Он мог бы поддерживать utf16 даже вообще при полном отсутствии юникода в юзерспейсе.

И кстати оригинальная win95, которая даже не знала fat32, уже делала файлы в таком формате (и даже на дискетах с fat12). Формально fat тут вообще ни при чём, это спецификация длинных имён файлов в директории а не он.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от Shushundr

Ну ещё бы не сработало. Это дефолтные опции ядра в OpenWrt. Вообще они должны бы были CONFIG_FAT_DEFAULT_UTF8=y сделать дефолтом, но видимо никто не озаботился. Я ещё 18-ю версию собирал и это было одним из моих патчек к дефолтным опциям. Кроме этого ещё добавлял дополнительные утилиты в busybox и выключал luci и всё с ним связанное.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

Вообще они должны бы были CONFIG_FAT_DEFAULT_UTF8=y сделать дефолтом, но видимо никто не озаботился.

Меня вот что волнует, допустим я потрачу 2 месяца и научусь собирать прошивку OpenWrt для моего роутера. После этого флешка будет читаться на Windows с такими новыми настройками роутера для Utf-8 ? (в смысле, после вынимания из роутера и втыкания в комп с Windows).

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Меня вот что волнует, допустим я потрачу 2 месяца и научусь собирать прошивку OpenWrt для моего роутера.

Да какие два месяца? Максимум два дня. Скачиваешь архив исходников, make menuconfig и потом там выбрать модель роутера. Затем ещё какая-то команда, забыл. Ну если что-то не так пойдёт, например какой-то из сайтов, где надо качать исходники окажется под роскомпозором, может придётся повозиться, найти как поменять зеркало, но вообще это удивительно просто.

Если в меню не хочешь лазить, найди файл где находится конфиг ядра, например target/linux/ath79/config-5.15 или какое там ядро будет собираться для твоего роутера (см в своей прошивке имя target) и дописывай в конец строчку CONFIG_FAT_DEFAULT_UTF8=y. После этого в menuconfig можешь вообще ничего не делать, только выбрать target и конкретную модель.

После этого флешка будет читаться на Windows с такими новыми настройками роутера для Utf-8 ?

Да, будет. Но кому нужна Windows? Главное что будет читаться в GNU/Linux без всяких манипуляций с опциями, просто по mount /dev/flash /mnt/flash

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 4)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.