Character encoding (Русский)
Кодировка задаёт соответствие между байтами и человекочитаемыми символами. Самой распространённой кодировкой является UTF-8. [1]
UTF-8
Терминал
В большинстве терминалов UTF-8 используется по умолчанию. Однако некоторые терминалы (например, gnome-terminal, rxvt-unicode) нужно запускать в окружении с локалью UTF-8, то есть установленная вами локаль должна оканчиваться на .UTF-8
; смотрите раздел Локали#Установка локали.
Вставка символов Юникода
Смотрите List of applications/Utilities#Text input.
- В LibreOffice есть встроенная таблица символов (Вставка > Специальные символы), которая также показывает код выбранного символа.
- Клавиша Compose: можно настроить XCompose для ввода специальных символов.
- AltGr позволяет получить доступ к дополнительным рядам со специальными символами, а также управляющими символами вроде ZWNJ и RTL mark.
Кодировка URL
В ссылках (URI) можно использовать только некоторые ASCII-символы; для остальных символов применяется процентное кодирование, из-за которого ссылки могут становиться длинными и нечитаемыми.
Firefox умеет выполнять декодирование при копировании ссылки из адресной строки — для этого включите browser.urlbar.decodeURLsOnCopy
через about:config
. Также можно просто добавить пробел перед ссылкой, и тогда она скопируется в декодированном виде. В Chromium аналогичных способов нет, но можно выделить часть ссылки после https://
и скопировать только её.
В командной строке можно использовать python для декодирования ссылки:
$ python3 -c "import sys; from urllib.parse import unquote; print(unquote(sys.stdin.read().strip()))"
Решение проблем
Проблемы с кодировками обычно возникают, когда две программы обмениваются данными в разных кодировках, и из-за неправильной интерпретации передаваемых байтов возникают кракозябры.
Неправильная кодировка архива
В старых версиях Windows (XP, Vista, 7) Проводник создавал zip-архивы с использованием системной («ANSI») кодировки, зависящей от языка системы. Так как zip-архивы не хранят информацию о кодировке, при распаковке придётся указывать правильную кодировку вручную.
Для распаковки можно использовать unzip, который собирается в Arch с патчем, добавляющим поддержку указания кодировки. Например, для распаковки архива с использованием кодировки CP1251 (кириллица) можно использовать такую команду:
$ unzip -O CP1251 файл.zip
Если вы не знаете правильную кодировку, используйте опцию -l
, чтобы посмотреть список файлов без распаковки, и пробуйте разные кодировки, пока имена файлов не станут читаемыми:
$ unzip -lO CP866 файл.zip
Японские версии Windows создают zip-архивы с кодировкой Shift-JIS (SJIS):
$ unzip -O shift-jis nihongo.zip
Китайские версии Windows создают zip-архивы с кодировкой GBK:
$ unzip -O gbk файл.zip
Также есть unzip-natspecAUR, который автоматически выбирает кодировку, соответствующую текущей локали.
Неправильная кодировка имени файла
Если у вас есть файл, имя которого хранится в файловой системе не в кодировке UTF-8, можно использовать convmv для переименования файла одновременно с перекодированием его имени:
$ convmv -f ИСХОДНАЯ_КОДИРОВКА -t UTF-8 --nosmart файл
Скорее всего вы не сможете ввести правильное имя файла вручную, потому что файловые менеджеры будут показывать знаки вопроса или квадраты; выполните команду ls
в каталоге с проблемным файлом — она покажет имя файла в экранированном виде, которое вы сможете использовать в вашей командной оболочке.
По умолчанию convmv только показывает, что будет сделано, без фактического переименования. Когда вы подберёте правильную кодировку (для кириллицы скорее всего CP1251
), добавьте опцию --notest
, чтобы выполнить переименование.
По умолчанию convmv пропускает имена файлов, которые хранятся в файловой системе уже в кодировке UTF-8. Опция --nosmart
позволяет принудительно выполнять перекодирование даже для таких файлов.
Команда convmv --list
покажет список всех поддерживаемых кодировок.
Неправильная кодировка содержимого файла
Для перекодирования содержимого файла можно использовать iconv
:
$ iconv -f ИСХОДНАЯ_КОДИРОВКА -t UTF-8 -o новый-файл исходный-файл
-f
задаёт кодировку, в которой находится исходный файл, -t
— кодировку, в которую его нужно перекодировать, а -o
— имя перекодированного файла, который будет создан. Список доступных кодировок можно посмотреть командой iconv -l
.
Vim
Если используется UTF-8 локаль, при открытии файлов в других кодировках могут появляться кракозябры. Для решения можно прописать запасные кодировки в vimrc
:
set fileencodings=utf8,cp936,gb18030,big5
Или можно явно задать :set fileencoding=ansi
. Vim выполнит перекодирование через iconv автоматически. Смотрите :h charset-conversion
.
Неправильная кодировка ID3 в файлах MP3
Можно выполнить перекодирование через python-mutagen или mp3unicode:
$ mid3iconv -e ИСХОДНАЯ_КОДИРОВКА XXX.mp3
Если вносить изменения в файл нежелательно, можно изменить поведение плеера. Например, для плееров, которые используют бэкенд GStreamer (Rhythmbox, Totem), можно указать переменную окружения, прописав в ней список нужных кодировок через двоеточие:
export GST_ID3_TAG_ENCODING=CP1251:GBK:UTF-8:GB18030
В плеере Quod Libet откройте Файл > Расширения > Расширенные настройки (или Файл > Настройки > Расширенное в более новой версии quodlibet-gitAUR), нажмите Я знаю, что делаю! и пропишите список нужных кодировок через пробел в поле ID3 encodings. Или можно вручную отредактировать файл настроек:
~/.config/quodlibet/config
... [editing] id3encoding = cp1251 ...
Неправильная кодировка при монтировании
Параметр монтирования iocharset
позволяет указать кодировку, в которой будут выводиться имена файлов. Его можно прописать в файле fstab. Пример для локали, использующей кодировку UTF-8:
/etc/fstab
... /dev/sdxx /media/win ntfs defaults,iocharset=utf8 0 0
Для локали GBK:
/etc/fstab
... /dev/sdxx /media/win ntfs defaults,iocharset=cp936 0 0 ...
Неправильная кодировка Samba
При использовании Arch в качестве сервера Samba для решения проблем с кодировками у Windows-клиентов может понадобиться добавить в /etc/samba/smb.conf
:
/etc/samba/smb.conf
... unix charset=gb2312 ...
Неправильная кодировка FTP
Если вы используете UTF-8 локаль, файл, скачанный с FTP-сервера, не использующего Юникод, может оказаться с кракозябрами в имени. Для lftp решить проблему можно путём добавления таких настроек:
.lftp/rc
... set ftp:charset "gbk" set file:charset "UTF-8" ...
Для gftp:
.gftp/gftprc
... remote_charsets=gb2312 ...
Однако имя загруженного файла по-прежнему с кракозябрами. Для решения можно пропатчить gftp: https://www.teatime.com.tw/%7Etommy/linux/gftp_remote_charsets.patch