对于我正在学习的课程,我需要编写一个程序,可以将包含以big-endian 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版。
为了清楚起见,请不要发布任何可以解决我所描述的作业问题的内容,因为这会被视为作弊。但是,如果您对我无法将utf-16be文件读入二进制文件或为什么非十六进制字符在原始数据中的原因有任何一般性的了解,那就太好了。我知道这不是一个完全实际的问题,因为已有方法可以自动化这个过程。但是,我想了解为什么我没有从utf-16be文件中获取正确的十六进制字符串,我希望这个问题对社区有一些普遍的用处。
答案 0 :(得分:0)
在您最初阅读数据时
" \ X06' \ x06D \ x06D \ X06:\ X06)"
看起来正确 - 它是阿拉伯语 - 表示为2字节字符。您可以使用Hex编辑器查看更多清算。
为什么您的数据是这样的 - 通常是因为您已将数据读取为BYTE字符串。
要从一组字节转换为字符串对象,您可以将它们编码为所需的编解码器。
这里有一个很好的例子和解释
[https://pymotw.com/2/codecs/]
将Python 3用于Unicode / Multibyte字符,这非常容易。
答案 1 :(得分:0)
您获得的字符串"\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'
这个词的意思是阿拉伯语:语言。