Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python编写unicode-这个字符有什么问题_Python_Unicode_Utf 8_Utf 16_Utf 16le - Fatal编程技术网

用python编写unicode-这个字符有什么问题

用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

在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('utf-16-le'))
但是,当上述任何一项被替换时,代码都可以正常工作

  • unichr(33033)和unichr(33035)工作正常

  • “utf-8”编码(无BOM,)


  • 如何识别无法正确写入的字符,以及如何编写带有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将为您编写。请参阅此答案以了解解释。此答案确实解决了问题。非常感谢!我会接受,一旦我调试完全。清晰和简洁-再次感谢!这个答案确实解决了这个问题。非常感谢!我会接受,一旦我调试完全。清晰和简洁-再次感谢!