用python编写unicode-这个字符有什么问题
在Python2.7中,我以unicode阅读,以utf-16-le编写。大多数字符的解释都是正确的。但有些不是,例如,u'\u810a',也称为。以下代码编写不正确:用python编写unicode-这个字符有什么问题,python,unicode,utf-8,utf-16,utf-16le,Python,Unicode,Utf 8,Utf 16,Utf 16le,在Python2.7中,我以unicode阅读,以utf-16-le编写。大多数字符的解释都是正确的。但有些不是,例如,u'\u810a',也称为。以下代码编写不正确: import codecs with open('temp.txt','w') as temp: temp.write(codecs.BOM_UTF16_LE) text = unichr(33034) # text = u'\u810a' temp.write(text.encode('ut
import codecs
with open('temp.txt','w') as temp:
temp.write(codecs.BOM_UTF16_LE)
text = unichr(33034) # text = u'\u810a'
temp.write(text.encode('utf-16-le'))
但是,当上述任何一项被替换时,代码都可以正常工作
如何识别无法正确写入的字符,以及如何编写带有BOM的“utf-16-le”编码文件,以打印这些字符或进行替换?您已经在使用编解码器库。在处理该文件时,应该使用open()和codecks.open()进行交换,以透明地处理编码
import codecs
with codecs.open('temp.txt', 'w', encoding='utf-16-le') as temp:
temp.write(unichr(33033))
temp.write(unichr(33034))
temp.write(unichr(33035))
如果在此之后出现问题,则可能是查看器问题,而不是Python脚本问题。您已经在使用编解码器库。在处理该文件时,应该使用open()和codecks.open()进行交换,以透明地处理编码
import codecs
with codecs.open('temp.txt', 'w', encoding='utf-16-le') as temp:
temp.write(unichr(33033))
temp.write(unichr(33034))
temp.write(unichr(33035))
如果在此之后出现问题,则可能是查看器问题,而不是Python脚本问题。您正在以文本模式打开文件,这意味着。不幸的是,您试图写入的字符包含一个字节,
0A
,该字节被解释为换行符,无法正确写入文件
改为以二进制模式打开文件:
open('temp.txt','wb')
您正在以文本模式打开文件,这意味着。不幸的是,您试图写入的字符包含一个字节,
0A
,该字节被解释为换行符,无法正确写入文件
改为以二进制模式打开文件:
open('temp.txt','wb')
@Joni的答案是问题的根源,但是如果您使用
编解码器。打开
,它总是以二进制模式打开,即使没有指定。使用utf16
编解码器也会使用本机endian ness自动写入BOM表:
import codecs
with codecs.open('temp.txt','w','utf16') as temp:
temp.write(u'\u810a')
温度txt的十六进制转储:
FF FE 0A 81
参考资料:@Joni的答案是问题的根源,但是如果您使用
编解码器。打开,它总是以二进制模式打开,即使没有指定。使用utf16
编解码器也会使用本机endian ness自动写入BOM表:
import codecs
with codecs.open('temp.txt','w','utf16') as temp:
temp.write(u'\u810a')
温度txt的十六进制转储:
FF FE 0A 81
参考资料:请定义“错误”。你期待什么?当使用unichr(33033)和unichr(33035)时,输出是正确的汉字。但是当我写unichr(33034)的时候脊, 我收到了乱码。你用什么来查看文件?写入了哪些字节,您希望看到哪些字节?我使用的是notepad++,它可以在粘贴字符时正确查看字符。使用上述方法写入字符时,十六进制值不匹配。请定义“错误”。你期待什么?当使用unichr(33033)和unichr(33035)时,输出是正确的汉字。但是当我写unichr(33034)的时候脊, 我收到了乱码。你用什么来查看文件?写入了哪些字节,您希望看到哪些字节?我使用的是notepad++,它可以在粘贴字符时正确查看字符。使用上述方法写入字符时,十六进制值不匹配。看起来不错,但如果我接受您的代码(并将“as temp”添加到开放行),我会得到以下错误:UnicodeDecodeError:“ascii”编解码器无法解码位置0处的字节0xff:序号不在范围(128)内。感谢您的更正。我注意到我使用下划线而不是破折号进行编码。请再试一次。您不应该显式地编写BOM,只要用encoding=“'utf-16'打开文件,BOM就会为您编写。请参阅此答案以获取解释,但如果我接受您的代码(并将“as temp”添加到打开的行中),我得到以下错误:UnicodeDecodeError:“ascii”编解码器无法解码位置0处的字节0xff:序号不在范围(128)内。感谢您的更正。我注意到我使用下划线而不是破折号进行编码。请重试。您不应该显式写入BOM,只需使用encoding=”打开文件即可“utf-16”和BOM将为您编写。请参阅此答案以了解解释。此答案确实解决了问题。非常感谢!我会接受,一旦我调试完全。清晰和简洁-再次感谢!这个答案确实解决了这个问题。非常感谢!我会接受,一旦我调试完全。清晰和简洁-再次感谢!