LINUX.ORG.RU

История изменений

Исправление proud_anon, (текущая версия) :

Кодировка файла 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, :

Кодировка файла 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).

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

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

Исходная версия proud_anon, :

Кодировка файла 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).

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

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