LINUX.ORG.RU

опять кодировка...

 , ,


0

3

Здравствуйте, подскажите обратима ли данная операция: Дано: а) Исходный файл в кодировке utf-8 б) Конвертер, который ошибочно определяет, что этот файл в кодировке cp1251. И осуществляет перекодировку якобы файла cp1251(который по настоящему utf-8) в ISO-8859-5 в) это видно в логе, который cp1251 Пример «Иероглифов»: РЎС?РЅСЏРЅСЃРЄР?СЏ Р?СЂРЁРЅР?

поигрался, с iconv - не полегчало...

поигрался, с iconv - не полегчало...

А что ты делал? Попробуй:

iconv --from-code=iso-8859-5 --to-code=cp1251

По идее, должен получиться исходный файл в UTF-8.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

К сожалению, не все так просто, попробуй «расшифровать» приведенный пример.

Сижу, рою, пытаюсь, понять, кодирую вручную, но пока туго:

Пример: закодированное слово - Жилищные услуги специально «криво» кодирую: recode utf8..cp1251 bat_test получаю строку, просматриваю в utf-8: Жилищные услуги Раскодирую: recode cp1251..utf-8 bat_test

Аналогичная строка, в логе, части очень похожи, но раскодировка не работает, чего-то нехватает ....

Р?РЁР?РЁС?РЅС?Р? СЃСЃР?СЃРІРЁ

Bsplesk
() автор топика
Ответ на: комментарий от Bsplesk

кодирую: recode cp1251..utf-8 bat_test

Раскодирую: recode utf8..cp1251 bat_test

Bsplesk
() автор топика
Ответ на: комментарий от Bsplesk

К сожалению, не все так просто, попробуй «расшифровать» приведенный пример.

А ты не мог бы выложить этот файл или часть его на какой-нибудь файлообменник? Ну, скажем, сделай

head --bytes=1K broken_file.txt > broken_file_head.txt
И выложи broken_file_head.txt, скажем, на rghost.net.

А то ведь у тебя файл в битой кодировке, который ты открыл текстовым редактором, потом скопипастил кусок сюда, причём твой браузер, естественное, перекодировал всё в UTF-8. Очень много промежуточных стадий между оригиналом и этим образцом.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

К сожалению, нет такой возможности. Но строка выглядит один в один, как на форуме. Р?РЁР?РЁС?РЅС?Р? СЃСЃР?СЃРІРЁ Кодировка файла cp1251, можно создать файл в cp1251, и скопировать строку из форума, если редактор ее не «переделает», то аналогично файлу.

Bsplesk
() автор топика
Ответ на: комментарий от Bsplesk

Кодировка файла cp1251, можно создать файл в cp1251, и скопировать строку из форума

Ты хотел сказать, в ISO-8859-5?

Я так и сделал. Получилось следующее:

$ hexdump -C broken_file.txt
00000000  c0 3f c0 a1 c0 3f c0 a1  c1 3f c0 a5 c1 3f c0 3f  |.?...?...?...?.?|
00000010  20 c1 a3 c1 a3 c0 3f c1  a3 c0 a6 c0 a1 0a        | .....?.......|
Перекодируем:
iconv --from-code=iso-8859-5 --to-code=cp1251 broken_file.txt > recoded.txt
Смотрим:
$ cat recoded.txt
�?Ш�?Ш�?н�?�? сс�?свШ
$ hexdump -C recoded.txt
00000000  d0 3f d0 a8 d0 3f d0 a8  d1 3f d0 bd d1 3f d0 3f  |.?...?...?...?.?|
00000010  20 d1 81 d1 81 d0 3f d1  81 d0 b2 d0 a8 0a        | .....?.......|
0000001e
Это почти валидная последовательность UTF-8. Видно однако, что твой рекодер те символы, которые есть в CP1251, но отсутствуют в Windows-1251, заменил на знак вопроса (3F). Однако если мы вручную в hex-редакторе заменим символы, которые поломались, целиком на знаки вопроса, получится, что оригинал был какой-то такой:
?Ш?Ш?н?? сс?свШ
Что несколько странно. Возможно, по дороге произошло ещё какое-то преобразование. Но кажется, что мы на верном пути.

В целом преобразование CP1251 → ISO-8859-5 необратимо, потому что некоторые символы, которые есть в Windows-1251, отсутствуют в ISO-8859-5. Мы видим, что соответствующие байты уже убиты (превращены в код 3F).

Так что тут только в том вопрос, сколько информации ещё можно восстановить из этого файла.

Но, может быть, кто-то знает какой-то способ.

Update. Можно, конечно, написать скрипт, чтобы подбирать по частотам и проч. Мы знаем начало кодов (D1 или D0) — это сокращает число вариантов. Но это уже если тебе надо во что бы то ни стало восстановить файл и нет никакой возможности получить оригинал.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от proud_anon

Кодировка файла cp1251, можно создать файл в cp1251, и скопировать строку из форума

Ты хотел сказать, в ISO-8859-5?

Нет, кодировка именно, cp1251, это обычный файл лога. Предполагаемая последовательность.

UTF8- достоверно(опр. как cp1251)-->UTF8-->ISO-8859-5(видно из лога, это xml файл, соотвт. кодовая ст. у него указана)-->cp1251(Лог)

Хотя, итог, вроде уже понятен, при операции utf8(как cp1251)-utf8-iso-cp1251 «байты» бьются необратимо :(

Bsplesk
() автор топика
Ответ на: комментарий от Zhopin

разве CP1251 не синоним Windows-1251? В чём отличие?

Опечатка это. Я хотел сказать, «есть в CP1251 но отсутствуют в ISO-8859-5».

proud_anon ★★★★★
()

Конвертер, который ошибочно определяет

Что за конвертер?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.