2017-02-18 15 views
0

Когда я преобразовал мой текст на этом сайте, будут преобразованы правильно:
http://string-functions.com/encodedecode.aspx
выбрать источник «Windows-1252» и цель «utf8».
Смотрите в скриншоте ниже:
https://i.stack.imgur.com/2Pn4E.pngIconv не полный новообращенный utf8

Но когда я конвертировать с помощью следующего кода, некоторые буквы не преобразуются и текст нарушается.

iconv -c -f UTF-8 -t WINDOWS-1252 <mytext.txt> fixed_mytext.txt 

Фраза, которая должна быть преобразована:

آموزش Ùˆ نرم اÙزارهای تعمیر مانیتور 

Если верно новообращенный должен быть эта фраза:

آموزش و نرم افزارهای تعمیر مانیتور 

вписатьтся помочь мне. спасибо

мой оригинал текста:

http://www.todaymagazine.ir/forum.txt 
+0

бесполезно размещать текст, который не находится в UTF-8 здесь. Он будет нарушен, и никто не сможет воспроизвести вашу ошибку. Отправьте шестнадцатеричный дамп ваших данных ('od -t x1 myfile.txt'). –

+0

my tex in hexadecimal: http://www.todaymagazine.ir/mytext-hex.txt – nekooee

+1

(1) Если вы публикуете ссылку на файл, размещайте ссылку на исходный файл, а не шестнадцатеричный дамп! (2) Файл большой, и большая часть его кажется ASCII, пожалуйста, разместите только соответствующий фрагмент. (3) Я пробовал то, что вы только что сделали, и это сработало для меня (я скопировал и вставил вашу фразу из вопроса, а не из связанного файла). У вас есть текст UTF-8, переинтерпретированный как Windows1252 и снова преобразованный в UTF-8 , Вам нужно конвертировать из UTF-8 в Windows-1252 *, а затем использовать результат как UTF-8 *. –

ответ

1

Оригинальный текст был в кодировке UTF-8. Он ошибочно интерпретировался как текст в Windows-1252 и преобразован из Windows-1252 в UTF-8. Это никогда не должно было быть сделано. Чтобы отменить повреждение, нам нужно преобразовать файл из UTF-8 в Windows-1252, а затем просто рассматривать его как файл UTF-8.

Однако есть проблемы. Буква ف кодируется в UTF-8 как 0xd9 0x81, а код 0x81 не является частью Windows1252.

К счастью, когда было сделано первое ошибочное преобразование, персонаж не был потерян или заменен вопросительным знаком. Он был преобразован в контрольный символ 0xc2 0x81.

Код 0xd9 в Windows1252, это буква Ù, которая в UTF-8 равна 0xc3 0x99. Таким образом, окончательная последовательность байтов для ف в преобразованном файле равна 0xc3 0x99 0xc2 0x81.

Мы можем просто заменить что-то ASCII-совместимым с помощью сценария sed, сделать обратное преобразование, а затем заменить его на ف.

LANG=C sed $'s/\xc3\x99\xc2\x81/===FE===/g' forum.txt | \ 
     iconv -f utf8 -t cp1252 | \ 
     sed $'s/===FE===/\xd9\x81/g' 

Результатом является исходный файл, закодированный в UTF-8.

(убедитесь, что ===FE=== не используется в тексте первого!)

+0

очень спасибо, что ты работал для меня :): * – nekooee

+0

Только вместо «utf8» следует использовать «utf-8». :) – nekooee