我有一个类似字节的对象,类似:
aa = b'abc\u6df7\u5408def.mp3'
我想以二进制模式将其保存到文件中。代码在下面,但效果不佳
if __name__=="__main__":
aa = b'abc\u6df7\u5408def.mp3'
print(aa.decode('unicode-escape'))
with open('database.bin', "wb") as datafile:
datafile.write(aa)
文件中的数据是这样的:
但是我想要正确的格式是这样,二进制数据中的unicodes:
如何转换字节以将其保存在文件中?
答案 0 :(得分:0)
\uNNNN
转义在字节字符串中没有意义,因为它们未指定字节序列。 Unicode代码点从概念上讲是字符串的抽象表示形式,并且不能直接映射到序列化格式(由字节组成,或者从原则上讲,是任何其他形式的具体符号表示形式)。
有 个定义明确的Unicode序列化格式;这些被称为“编码”。您似乎正在寻找这些字符的UTF-16大端编码。
aa = 'abc\u6df7\u5408def.mp3'.encode('utf-16-be')
通过这种方式,我相信您的其余代码应能按预期工作。
磁盘上的Unicode始终是 编码的,但是显然您必须知道编码才能正确读取。可选的byte-order mark (BOM)有时会写入序列化Unicode文本文件的开头,以帮助读者发现编码。这是一个非印刷字符,其唯一目的是帮助消除编码歧义,尤其是消除其字节顺序(big-endian与little-endian)。
但是,很多地方都在不需要BOM的UTF-8上进行标准化。编码本身是面向字节的,因此不受字节顺序问题的影响。也许也请参见https://utf8everywhere.org/