我有以下代码以二进制方式将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个字节.我可能忽略了一些微不足道的事情.
您将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:
绝对最低每个软件开发人员绝对必须知道关于Unicode和字符集(没有任何借口!)作者:Joel Spolsky
Ned Batchelder的实用Unicode
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |