将string.decode(' utf8')从python2转换为python3

时间:2016-07-12 14:32:26

标签: python python-2.7 python-3.x

我正在将一些代码从python2转换为python3。

在python2中,我可以做以下事情:

>>> c = '\xe5\xb8\x90\xe6\x88\xb7'
>>> print c
帐户
>>> c.decode('utf8')
u'\u5e10\u6237'

如何在python3中获得相同的输出(u' \ u5e10 \ u6237')?

修改

对于有此问题的其他人,我在查看了使用结果的回复后意识到每个角色都需要被视为一个单独的元素。一个转义的unicode表示,如' \ u5e10 \ u6237'是一个字符串,因此它不会自然地分成对应于原始汉字的部分。

>>> c = '帐户'
>>> type(c.encode('unicode-escape').decode('ascii'))
<class 'str'>
>>> [l for l in c.encode('unicode-escape').decode('ascii')]
['\\', 'u', '5', 'e', '1', '0', '\\', 'u', '6', '2', '3', '7']

您必须将输入字符串中的每个字符分开并将其单独转换为数组,除非您想在程序的下一部分再次解析它。因此我的解决方案是:

>>> [l.encode('unicode-escape').decode('ascii') for l in c]
['\\u5e10', '\\u6237']

另一种解决方案是将每个字符变为十六进制表示形式:

>>> [hex(ord(l)) for l in c]
['0x5e10', '0x6237']

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这叫做&#34; unicode-escape&#34;编码。下面是一个如何在python3中实现此行为的示例:

In [11]: c = b'\xe5\xb8\x90\xe6\x88\xb7'

In [12]: d = c.decode('utf8')

In [13]: print(d)
帐户

In [14]: print(d.encode('unicode-escape').decode('ascii'))
\u5e10\u6237

如果您想要bytes而非str,则可以简单地删除.decode('ascii')

答案 1 :(得分:1)

返回与python2中相同的unicode是不可能的:我没有在python3中看到像python2中的unicode对象。但是有可能获得unicode对象的值。

要做到这一点,你需要做几件事:
   - 使用值&#39; \ xe5 \ xb8 \ x90 \ xe6 \ x88 \ xb7&#39;创建一个字节元素。    - 将此byte元素转换为字符串    - 从字符串

中获取unicode代码

第一步很简单。要创建一个字节元素&#39; c&#39;与c相同的值,只需:

c = b'\xe5\xb8\x90\xe6\x88\xb7'

然后,阅读元素

c_string = c.decode() # default encoding is utf-8

最后,我创建了一个将字符串转换为字符+ unicode表示的函数

def get_unicode_code(text):
    result = ""
    for char in text:
        ord_value = ord(char)
        if ord_value < 128:
            result += char
        else:
            hex_string = format(ord_value, "x") # turning the int into its hex value
            if len(hex_string) == 2:
                unicode_code = "\\x"+hex_string
            elif len(hex_string) == 3:
                unicode_code = "\\u0"+hex_string
            else:
                unicode_code = "\\u"+hex_string
            result += unicode_code
    return result

get_unicode_code(d)将返回与d.encode('unicode-escape').decode('ascii')相同的内容,但效率可能较低。

它接受一个字符串作为参数,并返回一个带有unicode的字符串,而不是它所代表的字符。