Character encoding (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Character encoding. Дата последней синхронизации: 6 октября 2024. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Кодировка задаёт соответствие между байтами и человекочитаемыми символами. Самой распространённой кодировкой является UTF-8. [1]

UTF-8

Терминал

В большинстве терминалов UTF-8 используется по умолчанию. Однако некоторые терминалы (например, gnome-terminal, rxvt-unicode) нужно запускать в окружении с локалью UTF-8, то есть установленная вами локаль должна оканчиваться на .UTF-8; смотрите раздел Локали#Установка локали.

  • xterm — запустите с параметром -u8 или пропишите ресурс X xterm*utf8: 2.

Вставка символов Юникода

Смотрите 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()))"

Решение проблем

Проблемы с кодировками обычно возникают, когда две программы обмениваются данными в разных кодировках, и из-за неправильной интерпретации передаваемых байтов возникают кракозябры.

Важно: Крайне рекомендуется использовать UTF-8 локаль. В противном случае преобразование из UTF-8 в кодировку локали, которая не использует Юникод, может привести к потере неподдерживаемых кодировкой символов.

Неправильная кодировка архива

В старых версиях 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
...
Примечание: Quod Libet поддерживает UTF-8 по умолчанию.

Неправильная кодировка при монтировании

Параметр монтирования 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