在UTF-8中具有相同表示的两个词在ASCII中具有不同的表示

时间:2013-12-12 06:37:21

标签: utf-8 python-imaging-library ansi farsi

我有一个波斯语单词,如果以UTF-8编码显示,就像这样:

"خطاب"

我有两个版本的这个词,在UTF-8的Notepad ++中都显示如上。 但如果我在ANSI模式下查看它们,我会看到:

ïºïºŽï»„ﺧ

而另一个我看到了:

خطاب    

为什么相同的单词在ANSI格式中有这么不同的表示?当我在Python中使用PIL绘制这些时,结果对于其中一个是正确的而对另一个不正确。

我很感激你的帮助。

1 个答案:

答案 0 :(得分:2)

在Unicode中,您可以通过多种方式表示某些字符。 在这种情况下,这些阿拉伯字符在第一种情况下使用Arabic Presentation Forms-B Block的代码点表示,在第二种情况下使用常规Arabic Block的代码点表示。

如果您转换文字

  

ïºïºŽï»“ﺧ

到字节流,你得到

  

EFBA 0F EFBA8E EFBB84 EFBAA7

请注意,您没有在上面的文本中看到代表0F字节的字符,因为它是非可视字符。

现在该字节流表示UTF-8编码的文本。解码它将为您提供以下Unicode代码点:

  

FE8F FE8E FEC4 FEA7

您可以匹配Arabic Presentation Forms-B Block中的那些以形成您的波斯语文字:

  

خطاب

您可以对其他文本执行相同的过程:خطاب为您提供字节流D8AE D8B7 D8A7 D8A8,它表示UTF-8编码的文本,解码后会为您提供Unicode代码点{{1 }},与常规Arabic Block匹配,再次为您提供文字062e 0637 0627 0628