iconv未完全转换为utf8

时间:2017-02-18 19:22:27

标签: linux iconv

当我在本网站上转换我的文字时,请正确转换:
http://string-functions.com/encodedecode.aspx
我选择源'Windows-1252'并定位'utf-8' 请参见下面的屏幕截图:
https://i.stack.imgur.com/2Pn4E.png

但是当我使用以下代码进行转换时,某些字母不会被转换,文本会被中断。

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

应转换的短语:

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

如果真的转换应该是这个短语:

 آموزش و نرم افزارهای تعمیر مانیتور 
请帮助我。谢谢

我的原始文字:

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

1 个答案:

答案 0 :(得分:1)

原始文本采用UTF-8格式。它被错误地解释为Windows-1252中的文本,并从Windows-1252转换为UTF-8。这应该是从来没有做过的。要解除我们将文件从UTF-8转换为Windows-1252所需的损坏,然后将其视为UTF-8文件。

但是有一个问题。字母is以UTF-8编码为0xd9 0x81,代码0x81不是Windows1252的一部分。

幸运的是,当第一次错误转换时,角色没有丢失或被问号替换。它被转换为控制字符0xc2 0x81

0xd9代码在Windows1252中,它是字母Ù,在UTF-8中是0xc3 0x99。因此,转换后文件中ف的最终字节序列为0xc3 0x99 0xc2 0x81

我们可以使用sed脚本替换为ASCII友好的内容,进行逆转换,然后将其替换回ف。

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===!)