Какая терминальная кодировка является значением по умолчанию на Linux, и которые наиболее распространены?

В bash, попробуйте следующий код:

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

Запустите скрипт как этот:

./script.bash *
4
03.02.2014, 01:30
4 ответа

Самая старая кодировка символов, используемая в таких консолях, как VT52 , была ASCII .

Это основное решение было принято в течение многих лет. Большинство консолей используют ASCII в качестве основного набора символов, определенного ANSI. Следующим набором кодировок (на западе )являются наборы ISO -8859 (от 1 до 15 ). По одному для каждого языка (языковой группы ). Наиболее распространенным является ISO -8859 -1 (английский ), а другой пропорционально соответствующему используемому языку.

Затем наиболее общий список мировых символов — это Unicode, который в Linux обычно кодируется в UTF -8.

Это самая распространенная кодировка для современных терминалов и программ в Linux.


От более общих настроек к частным:

ОС

По умолчанию в debian, начиная с Etch наApr 8th 2007(13 лет назад ), используется utf -8.

Note : Fresh Debian/Etch installation have UTF8 enabled by default.

И подтверждено в примечаниях к выпуску :

.

The default encoding for new Debian GNU/Linux installations is UTF-8. A number of applications will also be set up to use UTF-8 by default.

Это означает, что Debian (и Ubuntu, Mint и многие другие )поддерживают utf -8 по умолчанию.

регион

Какая кодировка (и страна )фактически выбирается пользователем с помощью команды dpkg-reconfigure locales, остается на усмотрение пользователя.

Служит для настройки конкретных параметров команды компьютера locale.

Все LC_*«переменные среды» оказывают определенное влияние на каждый из разделов страны/языка (частей ), как определено спецификацией POSIX .

телетайп

Но это всего лишь «общие» настройки. Конкретный терминал может (или не может )соответствовать ему. Ну и вообще обычная кодировка для большинства терминалов сегодня utf8.

Кодировка для конкретного терминала (tty )может быть найдена, если установлено значение utf8 с:

$ stty -a | grep -o '.iutf8'
 iutf8

То есть нет -перед выводом результата.

клемма

Ноterminal(окно графического интерфейса ), внутри которого (обычно )работает tty-терминал, также имеет собственную настройку локали. Если настройки вменяемые , возможно:

$ locale charmap
UTF-8

Будет правильный ответ.

Но это всего лишь беглый и очень поверхностный взгляд на все настройки i18n в linux/unix.

Заберите :Вероятно, если Linux использует utf8, это будет лучшим выбором.

7
27.01.2020, 20:56

Я использовал бы подобную эвристику, которую Вы используете с пользователями Windows, но через переменную окружения ЛЕНГА. Например, в моей системе:

$ echo $LANG
en_US.UTF-8

Здесь, в коде говорится, что я использую английский язык, но с кодировкой UTF-8 имен файлов и файлов.

Как правило у пользователей Linux, использующих UTF-8, будет "UTF-8" в конце их переменной окружения ЛЕНГА.

2
27.01.2020, 20:56

Современные установки Linux (в течение по крайней мере приблизительно 5 лет, вероятно, дольше) используют UTF-8. Как это обрабатывается путем устанавливания значений среды LC_CTYPE, LANG, и LANGUAGE. Посмотрите, например, обсуждения здесь или здесь (центрируемый Unicode).

1
27.01.2020, 20:56

Для довольно современных систем Linux/Unix Вы не должны должны быть волноваться о терминальном кодировании. Просто используйте getwchar или fgetws читать из stdin (или терминал). [Примечание 1]

Как man getwchar говорит, в Notes раздел:

Разумно ожидать, что getwchar () на самом деле считает многобайтовую последовательность из стандартного входа и затем преобразует его в широкий символ.

Существует подобное примечание в man fgetws.

С Linux также разумно ожидать кодирование wchar_t быть unicode, независимо от локали. C99 стандарт позволяет реализации определять макрос __STDC_ISO_10646__ указать на это wchar_t значения соответствуют кодовым точкам Unicode [Примечание 2], таким образом, можно вставить проверку времени компиляции на это ожидание, которое должно успешно выполниться на современных установках Linux со стандартными наборами инструментальных средств. Это, вероятно, успешно выполнится в современных системах Unix также, хотя нет никакой гарантии.


Примечания:

[1] Действительно необходимо инициализировать локаль путем вызова setlocale(LC_ALL, ""); однажды в начале выполнения программы. Посмотрите man setlocale.

[2] Значение __STDC_ISO_10646__ дата (в формате yyyymmL) соответствие дате соответствующей версии стандарта Unicode. Точная формулировка из стандарта (проект):

Следующие макро-имена условно определяются реализацией:

__STDC_ISO_10646__ Целочисленная константа формы yyyymmL (например, 199712L). Если этот символ определяется, то каждый символ в Unicode потребовал набора при хранении в объекте типа wchar_t, имеет то же значение как короткий идентификатор того символа. Unicode потребовал, чтобы набор состоял из всех символов, которые определяются ISO/IEC 10646, наряду со всеми поправками и техническими исправлениями, по состоянию на указанный год и месяц. Если некоторое другое кодирование будет использоваться, то макрос не должен быть определен, и фактическое используемое кодирование определяется реализацией.

0
27.01.2020, 20:56
  • 1
    : дата макроса на самом деле соответствует стандарту ISO 10646, 199712L соответствует несовместимому изменению, куда корейский хангыль был перемещен от некоторого блока до другого ("корейская путаница", сослался на в RFC UTF-8). –  ninjalj 12.06.2016, 13:34

Теги

Похожие вопросы