Auf*_*ind 4 python string encoding escaping
考虑这个功能:
def escape(text):
print repr(text)
escaped_chars = []
for c in text:
try:
c = c.decode('ascii')
except UnicodeDecodeError:
c = '&{};'.format(htmlentitydefs.codepoint2name[ord(c)])
escaped_chars.append(c)
return ''.join(escaped_chars)
Run Code Online (Sandbox Code Playgroud)
它应该通过相应的htmlentitydefs转义所有非ascii字符.不幸的是python抛出
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
当变量text包含字符串,其repr()是u'Tam\xe1s Horv\xe1th'.
但是,我不使用str.encode().我只用str.decode().我错过了什么吗?
Don*_*ion 11
这是一个误导性的错误报告,它来自python处理de /编码过程的方式.你试图第二次解码一个已经解码过的字符串,这会混淆Python函数,它会让你反过来混淆你的报复!;-)编码/解码过程据我所知,由编解码器模块进行.在某处,存在这种误导性的异常消息的起源.
您可以自己检查:或者
u'\x80'.encode('ascii')
Run Code Online (Sandbox Code Playgroud)
要么
u'\x80'.decode('ascii')
Run Code Online (Sandbox Code Playgroud)
将抛出Unicode 编码错误,其中a
u'\x80'.encode('utf8')
Run Code Online (Sandbox Code Playgroud)
不会,但是
u'\x80'.decode('utf8')
Run Code Online (Sandbox Code Playgroud)
再一次!
我猜你对编码和解码的含义感到困惑.简单来说:
decode encode
ByteString (ascii) --------> UNICODE ---------> ByteString (utf8)
codec codec
Run Code Online (Sandbox Code Playgroud)
但为什么codec这个decode方法有一个参数?好吧,底层函数无法猜测ByteString编码的编解码器,所以作为codec参数提示.如果没有提供,则假定您的意思sys.getdefaultencoding()是隐式使用.
所以当你使用c.decode('ascii')你)有(编码)的字节字符串(这就是为什么你用解码)b)您想获得一个Unicode的表现对象(这是你用什么解码)和c)编解码器中的字节串是编码是ascii.
另请参见:
/sf/answers/25913961/
http://docs.python.org/howto/unicode.html
http://www.cl.cam.ac.uk/~mgk25/unicode. html#utf-8
http://www.stereoplex.com/blog/python-unicode-and-unicodedecodeerror
你传递的字符串已经是unicode了.因此,在Python可以调用decode它之前,它必须对它进行实际编码 - 它默认情况下使用ASCII编码.
编辑以添加它取决于您想要做什么.如果您只想将带有非ASCII字符的unicode字符串转换为HTML编码表示,则可以在一次调用中完成:text.encode('ascii', 'xmlcharrefreplace').
| 归档时间: |
|
| 查看次数: |
10289 次 |
| 最近记录: |