python 中文编码差异_读取python中以不同编码选项保存的文件后的输出差异

I really I can't understand how to compare same string coming from differently encoded file.

记事本用三种不同的编码方式对字符串进行编码,得到三种不同的字节序列。要检索字符串,必须使用相同的编码对这些字节进行解码:>>> ansi_bytes = '40M_\xc3z\xad\xb5\xb4\xfa\xb8\xd5\xc0\xc9'

>>> utf16_bytes = '4\x000\x00M\x00_\x00\xc3\x00z\x00\xad\x00\xb5\x00\xb4\x00\xfa\x00\xb8\x00\xd5\x00\xc0\x00\xc9\x00'

>>> utf8_bytes = '40M_\xc3\x83z\xc2\xad\xc2\xb5\xc2\xb4\xc3\xba\xc2\xb8\xc3\x95\xc3\x80\xc3\x89'

>>> ansi_bytes.decode('mbcs')

u'40M_\xc3z\xad\xb5\xb4\xfa\xb8\xd5\xc0\xc9' # 40M_Ãz­µ´ú¸ÕÀÉ

>>> utf16_bytes.decode('utf-16le')

u'40M_\xc3z\xad\xb5\xb4\xfa\xb8\xd5\xc0\xc9' # 40M_Ãz­µ´ú¸ÕÀÉ

>>> utf8_bytes.decode('utf-8')

u'40M_\xc3z\xad\xb5\xb4\xfa\xb8\xd5\xc0\xc9' # 40M_Ãz­µ´ú¸ÕÀÉ“ANSI”(而不是“ASCI”)是Windows(有点误导性地)将其默认的特定于语言环境的代码页称为1252(西欧语,在Python中可以作为windows-1252)调用,但这会因机器而异。您可以使用名称mbcs从Windows上的Python获得此编码。

“Unicode”是Windows用于UTF-16LE编码的名称(非常误导,因为Unicode是字符集标准,而不是任何类型的字节字符编码本身)。与ANSI和UTF-8不同,这不是一种与ASCII兼容的编码,因此您尝试从文件中读取一行失败,因为UTF-16LE中的行终止符不是\n,而是\n\x00。这在上面的字节字符串的开头留下了一个伪\x00。

“UTF-8”的名称至少是准确的,但Windows喜欢在其“UTF-8”文件的前面加上伪字节顺序标记,这样当你解码它们时,它会给你一个不需要的u'\uFEFF'字符。如果您想接受从记事本保存的“UTF-8”文件,可以手动删除它或使用Python的utf-8-sig编码。

您可以使用codecs.open()而不是open()来读取具有自动Unicode解码的文件。这也修复了UTF-16换行符的问题,因为这样\n字符是在解码后而不是之前检测到的。在I read directory path from that asci file and do os.walk()

Windows文件名在本机被处理为Unicode,所以当你给Windows一个字节字符串时,它必须猜测需要什么编码才能将这些字节转换成字符。它选择ANSI而不是UTF-8。如果您使用的是同一台机器的ANSI编码的文件中的字节字符串,那么就可以了,但是在这种情况下,您将被限制为适合您的计算机区域设置的文件名。在西欧,40M_Ãz­µ´ú¸ÕÀÉ适合,但{}则不适合,因此您根本无法引用中文文件。在

Python支持将Unicode文件名直接传递给Windows,这避免了这个问题(大多数其他语言无法做到这一点)。将一个Unicode字符串传递到文件系统函数中,比如os.walk(),您应该得到Unicode字符串,而不是失败。在

因此,对于UTF-8编码的输入文件,类似于:

^{pr2}$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值