[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