Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Русскоязычное Linux-сообщество ([info]lj_ru_linux)
@ 2017-02-21 09:48:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Resolved: Загадочная проблема с кодировками
На домашней машинке стоит линукс (Debian 7, если это имеет какое-то значение). Некоторые директории и файлы там названы на русском языке. Локаль хоть и не русская, но UTF-8:
$ locale
LANG=en_IE.UTF-8
LANGUAGE=en_IE:en
LC_CTYPE="en_IE.UTF-8"
LC_NUMERIC=en_GB.utf8
LC_TIME=en_GB.utf8
LC_COLLATE="en_IE.UTF-8"
LC_MONETARY=en_GB.utf8
LC_MESSAGES="en_IE.UTF-8"
LC_PAPER=en_GB.utf8
LC_NAME="en_IE.UTF-8"
LC_ADDRESS="en_IE.UTF-8"
LC_TELEPHONE="en_IE.UTF-8"
LC_MEASUREMENT=en_GB.utf8
LC_IDENTIFICATION="en_IE.UTF-8"
LC_ALL=

так что всё нормально читается и в терминалах, и в mc, и в иксовых приложениях.

Когда я захожу на эту машинку с ноутбука (тоже Debian, только 8, и с такой же локалью) по ssh (или по sshfs), тоже всё нормально.
А вот когда захожу с другой машинки (тот же Debian 8, только кодировка чуточку другая, но тоже UTF-8:
$ locale
LANG=en_GB.utf8
LANGUAGE=
LC_CTYPE="en_GB.utf8"
LC_NUMERIC=en_GB.utf8
LC_TIME=en_GB.utf8
LC_COLLATE="en_GB.utf8"
LC_MONETARY=en_GB.utf8
LC_MESSAGES="en_GB.utf8"
LC_PAPER=en_GB.utf8
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT=en_GB.utf8
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

то русские названия почему-то нечитабельны. Хотя русские буквы, которые я сам набираю, нормально видятся:
$ ls -ld *Выс*
drwxr-xr-x 39 dil dil 4096 Oct 23 00:56 ???????????????? ????????????????

mc запустил, там те же вопросики. Ощущение такое, что кодировки разные.

Хотя в самих названиях явно UTF-8:
$ ls -ld *Выс* | hexdump -C
00000000  64 72 77 78 72 2d 78 72  2d 78 20 33 39 20 64 69  |drwxr-xr-x 39 di|
00000010  6c 20 64 69 6c 20 34 30  39 36 20 4f 63 74 20 32  |l dil 4096 Oct 2|
00000020  33 20 30 30 3a 35 36 20  d0 92 d0 bb d0 b0 d0 b4  |3 00:56 ........|
00000030  d0 b8 d0 bc d0 b8 d1 80  20 d0 92 d1 8b d1 81 d0  |........ .......|
00000040  be d1 86 d0 ba d0 b8 d0  b9 0a                    |..........|
0000004a

Попробовал перекодировать iconv'ом в разные стороны, всё равно ничего не прочитать. Но.. если перекодировать из utf8 в cp1251, а потом обратно в utf-8, тогда оно ВНЕЗАПНО читается:
$ ls -ld *Выс* | iconv -f utf8 -t cp1251 | iconv -f cp1251 -t utf8
drwxr-xr-x 39 dil dil 4096 Oct 23 00:56 Владимир Высоцкий

И через cp866 точно так же:
$ ls -ld *Выс* | iconv -f utf8 -t cp866 | iconv -f cp866 -t utf8
drwxr-xr-x 39 dil dil 4096 Oct 23 00:56 Владимир Высоцкий


Отчего такое может быть???

Upd: ОЙ, БЛИН..
Оказалось, что iconv тут ни при чём, достаточно просто пропустить вывод ls через pipe, вот хоть просто через cat, и всё уже читается:
$ ls -ld *Выс* 
drwxr-xr-x 39 dil dil 4096 Oct 23 00:56 ???????????????? ????????????????
$ ls -ld *Выс* | cat
drwxr-xr-x 39 dil dil 4096 Oct 23 00:56 Владимир Высоцкий


Upd2: По рекомендациям в комментах оказалось, что проблема решается либо добавлением отсутствующей кодировки en_GB.UTF-8 в /etc/locale-gen и генерацией соответствующей локали на серверной стороне,
либо наоборот - отключением AcceptEnv LANG LC_* в sshd_config


(Читать комментарии) (Добавить комментарий)