Вплив $ LANG на термінал


11

Я намагаюся дізнатися, як $LANGзмінна поводиться з gnome-терміналом (і його параметром перевагу кодування символів). Я використовую iso8859-1 (latin1) як основний набір символів, і всі мої імена кодуються як такі.

Для наступних тестів я зроблю ls -lкаталог з іспанськими наголошеними символами у своїх іменах:

Справа №1:

  • gnome-термінал, налаштований для ISO-8859-1
  • LANG встановлено на "en_US-iso8859-1"
  • Результат: я бачу всі файли правильно

Справа №2:

  • gnome-термінал, налаштований для UTF-8
  • LANG встановлено на "en_US-iso8859-1"
  • Результат: Я бачу символи сміття для всіх іспанських символів. Це очікується, коли я змінив кодування символів для терміналу

Справа №3:

  • gnome-термінал, налаштований для ISO-8859-1
  • LANG встановлено на "en_US-UTF-8"
  • Результат: Я бачу символи сміття для всіх іспанських символів.

Чому саме в цьому останньому випадку я бачу здивованих персонажів? Чи не повинен висновок ls надсилати назви файлів прямо на gnome-terminal, як вони є? А оскільки gnome-термінал налаштований для ISO-8859-1, я б очікував, що вони виглядатимуть правильно.

На якусь мить я подумав, що, можливо, можливо, баш розглядає мій $LANGзмінний і виконує певну конверсію. Потім я переключив свій термінал на UTF-8, але все ще не бачу символів правильно. Я навіть передав висновок ls в xxd і на моє здивування я все ще бачу файли, закодовані такими, як вони є: ISO-8859-1.

Для завершення: Якщо мій список містить символи ISO-8859-1, а мій емулятор термінала налаштований на те саме кодування символів: хто робить перетворення, якщо LANGвстановлено інше?

Дякуємо за будь-яку допомогу, яку ви можете надати.

Краконія

Відповіді:


5

Ваша установка для LANGповинен відповідати терміналу. Точніше, ваш параметр LC_CTYPE(кодування символів) повинен відповідати кодуванню терміналу, інші параметри локалі не повинні відповідати. А кодування терміналу зазвичай задається опцією емулятора терміналу, а не змінною локалі. В LC_CTYPEкомбінатах два свідчення: він говорить , що додатки , які кодують для використання на терміналі (як для введення і виведення), і він каже , що додатки , які кодують для використання з файлами. У випадках 2 і 3 ви сказали lsвідображати вихід у кодуванні, яке відрізняється від терміналу, тому вихід є потаємним.

Якщо ви працюєте з кодуваннями UTF-8 та Latin-1 в різний час, налаштуйте свій термінал для використання UTF-8. Це повинно призвести до встановлення LC_CTYPEзначення, що вказує на UTF-8; не змінюйте цей параметр (Якщо емулятор терміналу не встановлений LC_CTYPE, замініть його у вашому файлі запуску оболонки або протягом усього сеансу.) Для роботи з даними latin-1 в терміналі UTF-8 використовуйте luit(включений у комплект утиліти X).

LC_CTYPE=en_US.iso88591 luit

(Ви можете використовувати будь-яку іншу локаль з тим же кодуванням, наприклад LC_CTYPE=es_ES.iso88591 luit.)


Дякую Жиллу за чудове пояснення, особливо за пояснення двох показань для LC_CTYPE.
Краконія

Повертаючись до мого останнього випадку: я подумав, що, оскільки всі назви файлів були закодовані латиною1, а також те, що мій кінцевий пристрій виводу, той, що створює гліфи (мій термінал), також був налаштований на latin1, я очікував, що файли вірно побачать (незалежно від LC_CTYPE) ...
Craconia

Мені ніколи не спадало на думку, що lsрозглянути LC_CTYPE (у цьому випадку встановлено значення UTF-8) та виконати якусь перевірку набору символів: кожного разу, коли він побачить щось, що не сумісне з набором символів, воно б виплюнуло конкретний символ (наприклад, "?" "). Я сказав "валідація", оскільки він не здійснить "конверсію", як це робить luit. Це так?
Краконія

@Craconia У третьому випадку lsзамінює недруковані символи на ?. Більшість рядків, закодованих латиницею 1, які представляють реальні слова, мають недруковані символи, якщо їх інтерпретувати як UTF-8.
Жил "ТАК - перестань бути злим"

5

У випадку №2 та №3 ви змішуєте два різних кодуючих UTF-8 та Latin-1. У випадку, якщо ви використовуєте латинську-1 для обох, тому у вас немає проблем.

lsКоманда (і всі інші добре поводяться програми) використовувати параметр LANG для визначення кодування .

Ви можете змішувати дві різні мови, але не слід змішувати два різних кодування .

Переконайтесь, що змінні середовища LC_ * також використовують те саме кодування, що і ваша змінна LANG.

Як правило, вам слід налаштувати систему на сьогодні, щоб вона використовувала лише UTF-8.

Якщо вам потрібно редагувати старомодні файли даних (наприклад, властивості java), вам слід скористатися спеціалізованим редактором (наприклад, java ide) або забезпечити кодування за допомогою інструментів типу iconv"перекодувати".


Спасибі. Так, у мене є плани найближчим часом перейти на UTF-8. Отримав купу файлів для конвертації плюс багато багатьох текстових файлів. iconv & convmv на допомогу ...
Craconia

0

Це може бути поза вашими потребами, але ....

Виявляється, в RHEL5, і, мабуть, до цього, багато сторінок, якими вони були, з якихось передбачених причин, були визнані. Тобто, сторінка "raw man" перетворена з нативного символу, встановленого в 7-бітний ASCII. Незалежно від того, що ви робите з LC та LANG, довідкова сторінка latin1виробляє чоловічу сторінку, яка фактично марна. Всі спеціальні (8-бітні) символи всередині були замінені 7-бітовими заповнювачами (як правило ??). Я вважаю це веселим.

Але utf8версія цих довідкових сторінок може існувати в конкретному мовному каталозі. Хитрість полягає в тому, щоб запитати їх за своїм правильним іменем. Наприклад, latin1 насправді iso_8859-1. Якщо ви робите на ній сторінку чоловіка, і ваші налаштування LANG є правильними, ви бачите, що ви очікуєте; сторінка "man" знаходиться в специфічному для мови піддіречку ( en/man7/iso_8859-1.7). Але якщо ви попросите iso-8859-1чомусь отримати версію ASCII.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.