我有一些来自网络的文字:
£6.49
显然我希望这显示为:
£6.49
到目前为止,我已尝试过以下内容:
s = url['title']
s = s.encode('utf8')
s = s.replace(u'Â','')
Run Code Online (Sandbox Code Playgroud)
还有一些变种(在这个论坛上发现之后)
但是我仍然没有运气:
UnicodeDecodeError:'ascii'编解码器无法解码位置100中的字节0xc3:序号不在范围内(128)
谁能帮助我做到这一点?
更新:
添加repr示例和内容类型
u'Star Trek XI £3.99'
u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)
提前致谢.
如果,s=url['title']使得s等于以下内容:
In [48]: s=u'Oscar Winners Best Pictures Box Set \xc2\xa36.49'
Run Code Online (Sandbox Code Playgroud)
然后问题是
url,如果是案例1,我们需要查看定义的代码url.
如果是案例2,那么快速而肮脏的解决方法是s使用raw-unicode-escape编解码器对unicode对象进行编码:
In [49]: print(s)
Oscar Winners Best Pictures Box Set £6.49
In [50]: print(s.encode('raw-unicode-escape'))
Oscar Winners Best Pictures Box Set £6.49
Run Code Online (Sandbox Code Playgroud)
另见这个问题.
关于这样的标题s=u'Star Trek XI £3.99':再次,在它到达这个阶段之前修复问题会很好 - 也许通过查看如何url定义.但假设来自网络的内容格式错误,则解决方法是:
In [86]: import re
In [87]: print(re.sub(r'&#x([a-fA-F\d]+);',lambda m: unichr(int(m.group(1),base=16)),s))
Star Trek XI £3.99
Run Code Online (Sandbox Code Playgroud)
一点点解释:
注意
In [51]: x=u'£'
In [53]: x.encode('utf-8')
Out[53]: '\xc2\xa3'
Run Code Online (Sandbox Code Playgroud)
因此u'£',用utf-8编解码器编码的unicode对象成为字符串对象'\xc2\xa3'.
不知何故,url['title']被定义为unicode对象
u'\xc2\xa3'.(这u有很大的不同!)
因此u'\xc2\xa3',我们渴望的时候'\xc2\xa3'.u'\xc2\xa3'使用raw-unicode-escape编解码器对unicode对象进行编码将其转换为'\xc2\xa3'.