以二进制方式将unicode字符写入文件

Hai*_*ang 2 python unicode

我有以下代码以二进制方式将ASCII"@"字符写入文件:

fin=open('a.bin','wb')
fin.write('\x40')
fin.close()
Run Code Online (Sandbox Code Playgroud)

事实证明,"@"字符已被写入"a.bin",其长度为1字节.

但是,当我尝试编写一个unicode字符时:

fin=open('a.bin','wb')
fin.write(u'\x40')
fin.close()
Run Code Online (Sandbox Code Playgroud)

事实证明,"a.bin"仍然是1字节长.我认为它应该是2字节长,因为unicode字符占用2个字节.我可能忽略了一些微不足道的事情.

Mar*_*ers 7

您将Unicode与编码混淆.编码是一种标准,表示文本在0-255(字节)范围内的各个值的范围内,而Unicode是描述表示文本字形的代码点的标准.这两者是相关的,但不是一回事.

Unicode标准包括几种编码.UTF-16是一种这样的编码,每个代码点使用2个字节,但它不是标准中包含的唯一编码.UTF-8是另一种这样的编码,它每个代码点使用可变数量的字节.

但是,您的文件是使用ASCII编写的,这是Python 2在未指定显式编码时使用的默认编解码器.如果您希望每个代码点看到2个字节,请显式编码为UTF-16:

fin.write(u'\x40'.encode('utf16-le')
Run Code Online (Sandbox Code Playgroud)

这以小端字节顺序写入UTF-16 ; 还有一个utf16-be编解码器.通常,对于UTF-16或UTF32等多字节编码,您还需要包含BOM或字节顺序标记; 当您编写UTF-16而不选择任何endianes时,它会自动包含在内.

fin.write(u'\x40'.encode('utf16')
Run Code Online (Sandbox Code Playgroud)

强烈建议您在继续之前研究Unicode,编解码器和Python: