|
| |||
|
|
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 |
||||||||||||||