无法将 utf-16be 编码的阿拉伯语读入二进制

Trouble reading utf-16be encoded Arabic into binary

对于我正在学习的 class,我需要编写一个程序,可以将包含不同符号集(例如英文字母表、阿拉伯字母表)的以大端 utf-16 编码的文件转换为以 utf-8 编码的文件。通常,使用本机函数很容易做到这一点,但我必须根据作业手动完成所有操作。

简而言之,我的方法是读取二进制格式的 .txt 文件,将十六进制代码转换为二进制,将二进制转换为 utf-8,然后将其写入文件。我获得了一组 utf-16be 文件和相应的 utf-8 文件以用作测试用例。当我测试我在 utf-16be 英语语言文件上编写的程序时,它会生成一个与 utf-8 测试文件相同的文件。

但是,当我 运行 在包含阿拉伯字母字符的 utf-16be 编码文件上使用相同的程序时,我 运行 遇到了麻烦。更具体地说,当我尝试读取阿拉伯文件时,我得到的不是生成一组漂亮的十六进制代码,而是混合了非十六进制字符的十六进制代码。

例如,当我运行:

with open('arabic_in.txt', 'rb') as in_f:
    a_in = in_f.read()
    print a_in[:10]

输出为:

"\x06'\x06D\x06D\x06:\x06)"

有趣的是,我可以读取同一个文件并使用本机编码函数将其编码为 utf-8,生成的文件与测试文件相同。

with codecs.open(utf-16_arabic_in.txt, 'rb', encoding = 'utf-16be') as    
    f_in, codecs.open(um, 'wb', encoding = 'utf-8') as o_file:

i = f_in.read()
o_file.write(i)

教师允许我们查找有关读取、处理和写入二进制数据的一般信息。该作业旨在迫使我们与编码密切合作,并更好地理解它们的工作原理。因为我认为我遇到的问题根源于我阅读文件或相关内容的方式,所以我很乐意在这里寻求帮助。

我使用的是 2.7.10 版本。

明确一点,请不要 post 任何可以解决我所描述的家庭作业问题的东西,因为那样会被视为作弊。但是,如果您对为什么我无法将 utf-16be 文件读入二进制文件或为什么非十六进制字符在原始数据中有任何一般性见解,那就太好了。我知道这不是一个完全实际的问题,因为已经有自动执行此过程的方法。但是,我想了解为什么我没有从 utf-16be 文件中获取正确的十六进制字符串,我希望这个问题对社区有一些普遍用途。

在你最初阅读数据时

"\x06'\x06D\x06D\x06:\x06)"

看起来正确 - 它是阿拉伯语 - 表示为 2 字节字符。您可以使用十六进制编辑器看到更多的清除。

为什么你的数据是这样的——通常是因为你读取的数据是一个BYTE字符串。

要将一组字节转换为字符串对象 - 您需要将它们编码为所需的编解码器。

这里有很好的例子和解释

[https://pymotw.com/2/codecs/]

对 Unicode/Multibyte 个字符使用 Python 3 会容易得多。

您得到的字符串 "\x06'\x06D\x06D\x06:\x06)"utf-16be 文本(第一个单词)的二进制表示。所以你现在应该将它转换为 utf-8 :

 >>> a = "\x06'\x06D\x06D\x06:\x06)" 
 >>> b = unicode(a,"utf-16be") 
 >>> b # utf-8
 u'\u0627\u0644\u0644\u063a\u0629'
 >>> print b  
 اللغة
 >>> b.encode("utf-8") # binary representation of utf-8
 '\xd8\xa7\xd9\x84\xd9\x84\xd8\xba\xd8\xa9'

这个词在阿拉伯语中的意思是:语言。