Jump to content

# Character encoding (Русский)

2 languages

- English
- 日本語

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

Category:

- Localization (Русский)