[Comm] Wammu и кодировка
Dmitry Chistikov
dd1email на gmail.com
Пн Ноя 16 23:25:25 UTC 2009
> Ага, оно. Вот только убей не пойму, почему так. Ведь ср437 не содержит
> кириллицы.
> А так все получилось, спасибо.
Смотрите.
$ f='16/1 "%1x " "\n"'
Вот это - utf8 (символ "ж" представляется парой байт):
$ echo -n ж | hexdump -e "$f"
d0 b6
Вот этот же символ в, скажем, однобайтовой cp1251:
$ echo -n ж | iconv -f utf8 -t cp1251 | hexdump -e "$f"
e6
Здесь проблем нет.
А вот что получится, если неправильно интерпретировать входной поток
байт. Наши два байта задают два символа в какой-нибудь однобайтовой
кодировке, например cp437. Преобразуем вход в utf8:
$ echo -n ж | iconv -f cp437 -t utf8 | hexdump -e "$f"
e2 95 a8 e2 95 a2
Тут на каждый из двух символов потребовалось три байта. Отобразим эти
два символа:
$ echo ж | iconv -f cp437 -t utf8
╨╢
Это как раз наши знакомые.
Итак, жили-были шесть байт:
$ echo -n Муж | hexdump -e "$f"
d0 9c d1 83 d0 b6
(После интерпретации каждого из них как символа в соответствии с cp437
получилось шестнадцать:
$ echo -n Муж | iconv -f cp437 -t utf8 | hexdump -e "$f"
e2 95 a8 c2 a3 e2 95 a4 c3 a2 e2 95 a8 e2 95 a2
...но это разговор отдельный.)
Именно шесть символов, задаваемые (в cp437) исходными байтами, мы и получили:
$ echo Муж | iconv -f cp437 -t utf8
Муж
Как-то так =)
--
Дмитрий Чистиков,
dd1email at gmail dot com
Подробная информация о списке рассылки community