Python字符串解码问题

Python字符串解码问题,第1张

Python字符串解码问题

这是正在发生的事情:

  • sampleString是一个字节字符串(经cp1255编码)
  • sampleString.depre("cp1255")
    将字节字符串解码(解码== bytes-> unipre字符串)为unipre字符串
  • print sampleString.depre("cp1255")
    尝试将unipre字符串打印到stdout。打印必须 unipre字符串进行 编码 才能做到这一点(enpre == unipre字符串->字节)。您所看到的错误意味着python打印语句无法将给定的unipre字符串写入控制台的编码
    sys.stdout.encoding
    终端的编码。

因此,问题在于您的控制台不支持这些字符。您应该能够调整控制台以使用其他编码。具体 *** 作方法取决于您的 *** 作系统和终端程序。

另一种方法是手动指定要使用的编码:

print sampleString.depre("cp1255").enpre("utf-8")

您可以尝试使用的简单测试程序:

import sysprint sys.stdout.encodingsamplestring = 'xe0xe1xe2xe3xe4'print samplestring.depre("cp1255").enpre(sys.argv[1])

在我的utf-8终端上:

$ python2.6 test.py utf-8UTF-8אבגדה$ python2.6 test.py latin1UTF-8Traceback (most recent call last):UnipreEnpreError: 'latin-1' prec can't enpre characters in position 0-4: ordinal not in range(256)$ python2.6 test.py asciiUTF-8Traceback (most recent call last):UnipreEnpreError: 'ascii' prec can't enpre characters in position 0-4: ordinal not in range(128)$ python2.6 test.py cp424UTF-8ABCDE$ python2.6 test.py iso8859_8UTF-8�����

latin-1和ascii的错误消息表示字符串中的unipre字符无法用这些编码表示。

注意最后两个。我将unipre字符串编码为cp424和iso8859_8编码(http://docs.python.org/library/precs.html#standard-
encodings
上列出的两种编码均支持希伯来字符)。由于希伯来语unipre字符在编码中具有表示形式,因此使用这些编码也不例外。

但是,当我的utf-8终端收到的编码格式与utf-8不同时,就会感到非常困惑。

在第一种情况下(cp424),我的UTF-8终端显示ABCDE,这意味着A的utf-8表示对应于ה的cp424表示,即字节值65表示utf-8中的A和cp424的ה。

enpre
方法具有一个可选的字符串参数,可用于指定当编码不能表示字符时将发生的情况(文档)。支持的策略是严格(默认),忽略,替换,xmlcharref和反斜杠替换。您甚至可以添加自己的自定义策略。

另一个测试程序(我在字符串周围打印引号,以更好地显示忽略行为):

import syssamplestring = 'xe0xe1xe2xe3xe4'print "'{0}'".format(samplestring.depre("cp1255").enpre(sys.argv[1],       sys.argv[2]))

结果:

$ python2.6 test.py latin1 strictTraceback (most recent call last):  File "test.py", line 4, in <module>    sys.argv[2]))UnipreEnpreError: 'latin-1' prec can't enpre characters in position 0-4: ordinal not in range(256)[/tmp]$ python2.6 test.py latin1 ignore''[/tmp]$ python2.6 test.py latin1 replace'?????'[/tmp]$ python2.6 test.py latin1 xmlcharrefreplace'&#1488;&#1489;&#1490;&#1491;&#1492;'[/tmp]$ python2.6 test.py latin1 backslashreplace'u05d0u05d1u05d2u05d3u05d4'


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5674468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存