当前位置: 首页 > 面试题库 >

python中的双解码unicode

澹台华采
2023-03-14
问题内容

我正在针对似乎渴望返回双重UTF-8编码字符串的应用程序进行工作。

我发送u'XüYß'使用UTF-8编码的字符串,因此变成X\u00fcY\u00df(等于X\xc3\xbcY\xc3\x9f)。

服务器
仅回显我发送的内容,但返回以下内容:(X\xc3\x83\xc2\xbcY\xc3\x83\xc2\x9f应为X\xc3\xbcY\xc3\x9f)。如果我将其解码采用str.decode('utf-8')u'X\xc3\xbcY\xc3\x9f',使用UTF-8,它看起来像一个......的unicode字符串,包含原始字符串编码。

但是Python不允许我在不重新编码的情况下解码unicode字符串-由于某种原因而失败,这使我逃脱了:

>>> ret = 'X\xc3\x83\xc2\xbcY\xc3\x83\xc2\x9f'.decode('utf-8')
>>> ret
u'X\xc3\xbcY\xc3\x9f'
>>> ret.decode('utf-8')
# Throws UnicodeEncodeError: 'ascii' codec can't encode ...

如何说服Python重新解码字符串?-和/或是否有(实际)调试字符串中实际内容的方法,而没有通过所有隐式转换print使用该方法?

(是的,我已经向服务器端的开发人员报告了此行为。)


问题答案:

ret.decode()尝试ret使用系统编码隐式编码-在您的情况下为ascii。

如果您明确编码unicode字符串,则应该没问题。有内置的编码可以满足您的需求:

>>> 'X\xc3\xbcY\xc3\x9f'.encode('raw_unicode_escape').decode('utf-8')
'XüYß'

确实,.encode('latin1')(或cp1252)可以,因为这几乎是服务器很少使用的内容。该raw_unicode_escape编解码器将只是给你的东西识别在最后,而不是抛出一个异常:

>>> '€\xe2\x82\xac'.encode('raw_unicode_escape').decode('utf8')
'\\u20ac€'

>>> '€\xe2\x82\xac'.encode('latin1').decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character '\u20ac' in position 0: ordinal not in range(256)

如果遇到这种混合数据,则可以再次使用编解码器来规范化所有内容:

>>> '€\xe2\x82\xac'.encode('raw_unicode_escape').decode('utf8')
'\\u20ac€'

>>> '\\u20ac€'.encode('raw_unicode_escape')
b'\\u20ac\\u20ac'
>>> '\\u20ac€'.encode('raw_unicode_escape').decode('raw_unicode_escape')
'€€'


 类似资料:
  • 问题内容: 我通过xmlrpc从我的一个客户那里获得的字符串有问题。他给我发送了两次编码的utf8字符串:(因此,当我在python中获取它们时,我有一个unicode对象,该对象必须再解码一次,但显然python不允许这样做。我注意到我的客户端但是我需要在修复之前先进行快速解决。 来自tcp转储的原始字符串: 它将转换为: 我们得到的最好的是: 结果是正确的字符串,它是: 但是,这很丑陋,不能在

  • 作为Python的新手,我已经花了很多时间。 我怎么能解码这样的URL: 到python 2.7中的这个: 返回的内容非常难看。 仍然没有解决办法,任何帮助都是感激的。

  • 本文向大家介绍深入Python解释器理解Python中的字节码,包括了深入Python解释器理解Python中的字节码的使用技巧和注意事项,需要的朋友参考一下 我最近在参与Python字节码相关的工作,想与大家分享一些这方面的经验。更准确的说,我正在参与2.6到2.7版本的CPython解释器字节码的工作。 Python是一门动态语言,在命令行工具下运行时,本质上执行了下面的步骤:     当第一

  • 我无法让x和y滚动条在使用Python的Tkinter中工作,尽管我已经遵循了多个示例: 如何在python 3.4中使用tkinter添加2个滚动条 在tkinter中添加滚动条到一组小部件 如何在tkinter中制作一个合适的双滚动条框架 垂直和水平滚动条上的Tkinter小部件 水平和垂直滚动画布小部件 滚动条会出现,但当窗口小于框架时不会激活。我怎样才能让它工作(见下图)? 下面是产生我的

  • 问题内容: 我用python脚本下载了一个网页。在大多数情况下,这可以正常工作。 但是,这个有一个响应标头:GZIP编码,当我尝试打印此网页的源代码时,它的腻子中包含所有符号。 如何将其解码为普通文本? 问题答案: 我使用zlib从Web解压缩压缩的内容。

  • 我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?