Кілька питань щодо кодування символів файлової системи на Linux


12

Через велику кількість обмінних файлів між Windows ( кодування GBK ) та Linux ( кодування UTF-8 ), він легко зіткнеться з проблемами кодування символів, такими як:

  • zip / tar файли, ім'я яких містить китайські символи в системі Windows, розпакуйте / зніміть його в системі Linux.
  • запустити перенесений застарілий веб-додаток java (розроблений у системі Windows, використовуючи кодування GBK в JSP), який записує на диск файли з кодуванням GBK на диск.
  • ftp отримати / поставити файли з ім'ям кодування GBK між сервером Windows FTP та клієнтом Linux.
  • переключити середовище LANG в Linux.

Поширеним питанням попереднього згаданого є розміщення файлів / іменування файлів. Після google я отримав статтю Використання Unicode в Linux http://www.linux.com/archive/feed/39912 :

операційна система та багато утиліт не усвідомлюють, які символи представляють байти в іменах файлів.

Отже, можливо мати 2 中文 .txt файли з різним кодуванням:

[root@fedora test]# ls
????  中文
[root@fedora test]# ls | iconv -f GBK
中文
涓iconv: illegal input sequence at position 7
[root@fedora test]# ls 中文 && ls $'\xd6\xd0\xce\xc4'|iconv -f gbk
中文
中文

Запитання:

  1. Чи можливо налаштувати файлову систему Linux з використанням фіксованого кодування символів (наприклад, NTFS використовує UTF-16 внутрішньо) для зберігання імен файлів незалежно від середовища LANG / LC_ALL?
  2. Або те, що я насправді хочу запитати, це: чи можна дозволити ім'я файлу $'\xe4\xb8\xad\xe6\x96\x87.txt't .txt ( ) в середовищі zh_CN.UTF-8, а ім'я файлу $'\xd6\xd0\xce\xc4.txt't .txt ( ) в середовищі zh_CN.GBK відноситись до одного файлу ?
  3. Якщо це не налаштовується, то чи можна виправити ядро, щоб перекласти кодування символів між файловою системою та поточним середовищем (лише питання, а не запит на реалізацію)? і наскільки ефективність продуктивності, якщо це можливо?

Ви можете вирішити цю проблему з боку Windows, використовуючи Cygwin 1.7, який автоматично переводить між кодуванням UTF-16 файлової системи та тим, що кодування було визначено в налаштуваннях локальної мови. Він за замовчуванням застосовується до UTF-8, тому, наприклад, дьоготь Cygwin кодує імена файлів як UTF-8.
ak2

@ ak2 Спасибі, Cygwin справді хороший, я ним користуюся роками. Випадок tar / zip - лише приклад, в реальному середовищі файли zip / tar можуть створюватися іншими (наприклад, завантажувати файл з Інтернету).
LiuYan 刘 研

Відповіді:


8

Я трохи переформулював ваші запитання з причин, які повинні бути очевидними, коли ви читаєте їх послідовно.

1. Чи можливо налаштувати файлову систему Linux з використанням фіксованого кодування символів для зберігання імен файлів незалежно від середовища LANG / LC_ALL?

Ні, це неможливо: як ви згадуєте у своєму запитанні, ім'я файлу UNIX - це лише послідовність байтів; ядро нічого не знає про кодування, яке цілком є ​​концепцією простору користувача (тобто на рівні додатків).

Іншими словами, ядро ​​нічого не знає про LANG/ LC_*, тому не може перекласти.

2. Чи можна дозволити різним іменам файлів посилатися на один і той же файл?

Ви можете мати кілька записів каталогів, що посилаються на один і той же файл; це можна зробити через жорсткі посилання або символічні посилання .

Однак майте на увазі, що імена файлів, які не є дійсними в поточному кодуванні (наприклад, ваша символьна рядок GBK, коли ви працюєте в локалі UTF-8), відображатиметься погано, якщо вона взагалі є.

3. Чи можна виправити ядро, щоб перекласти кодування символів між файловою системою та поточним середовищем?

Ви не можете виправити ядро для цього (див. 1.), але ви можете -в теорії- виправити бібліотеку C (наприклад, glibc), щоб виконати цей переклад, і завжди перетворювати імена файлів у UTF-8, коли він викликає ядро, і перетворити їх назад у поточне кодування, коли воно читає ім'я файлу з ядра.

Більш простим підходом може бути написання файлової системи накладання з FUSE , яка просто перенаправляє будь-який запит файлової системи в інше місце після перетворення імені файлу в / з UTF-8. В ідеалі ви можете встановити цю файлову систему ~/trans, і коли буде здійснено доступ до ~/trans/a/GBK/encoded/pathфайлової системи FUSE, дійсно доступ до неї /a/UTF-8/encoded/path.

Однак проблема цих підходів полягає в тому, що ви робите з файлами, які вже існують у вашій файловій системі та не кодуються UTF-8? Ви не можете просто передати їх неперекладеними, тому що тоді ви не знаєте, як їх перетворити; ви не можете їх обробляти, перекладаючи недійсні послідовності символів, ?оскільки це може створити конфлікти ...


4
Існує така файлова система накладання: Convmvfs .
Жил "ТАК - перестань бути злим"

1

Що ви можете зробити - обмежити кількість підтримуваних локалів лише на локалі UTF-8.

http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5


2
Особисто я хочу, щоб у світі було лише 1 кодування шаблонів (UTF-8), але все ще запущене додаток, і сумісність між Windows та Linux повинна бути досягнута, більшість людей повинні зіткнутися з цим кошмаром.
LiuYan 刘 研
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.