将字符串.decode(';utf8';)从python2转换为python3
我正在将一些代码从python2转换为python3 在python2中,我可以做以下事情:将字符串.decode(';utf8';)从python2转换为python3,python,python-2.7,python-3.x,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') 编辑 对于其他有此问题的人,我在查看了响应后意识到,要利用结果,每个字符都需要作为单个元素处理。像“\
>>> c = '\xe5\xb8\x90\xe6\x88\xb7'
>>> print c
帐户
>>> c.decode('utf8')
u'\u5e10\u6237'
如何在python3中获得相同的输出(u'\u5e10\u6237')
编辑 对于其他有此问题的人,我在查看了响应后意识到,要利用结果,每个字符都需要作为单个元素处理。像“\u5e10\u6237”这样的转义unicode表示是一个字符串,因此它不会自然地划分为与原始汉字对应的部分
>>> 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']
另一种解决方案是将每个字符转换为十六进制表示:
>>> [hex(ord(l)) for l in c]
['0x5e10', '0x6237']
感谢您的帮助。不可能返回与python2中相同的unicode:我还没有看到像python2和python3中那样的unicode对象。但是可以获取unicode对象的值 要做到这一点,您需要做几件事:
-创建值为“\xe5\xb8\x90\xe6\x88\xb7”的字节元素 -将此字节元素转换为字符串 -从字符串中获取unicode代码 第一步很简单。要创建与c值相同的字节元素“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
def get_unicode_代码(文本):
result=“”
对于文本中的字符:
ord_值=ord(字符)
如果ord_值小于128:
结果+=字符
其他:
十六进制字符串=格式(ord_值,“x”)#将整数转换为十六进制值
如果len(十六进制字符串)==2:
unicode\u code=“\\x”+十六进制\u字符串
elif len(十六进制字符串)==3:
unicode\u code=“\\u0”+十六进制\u字符串
其他:
unicode\u code=“\\u”+十六进制\u字符串
结果+=unicode_码
返回结果
get\u unicode\u code(d)
将返回与d.encode('unicode-escape').decode('ascii')
相同的结果,但效率可能较低
它将字符串作为参数,并返回一个带有unicode的字符串,而不是它所表示的字符 这称为“unicode转义”编码。下面是一个如何在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
如果您希望它是
字节
而不是str
,您可以简单地去掉.decode('ascii')
,我个人会将该函数写成def get\u unicode\u code(text):result=''。join(char If ord(char)<128 else'\\u'+format(ord(char(char),'x')表示文本中的char格式)
@JonathanHartley感谢您更正了我的代码,使之更具Python风格。此函数返回的结果与Dean的最后一行相同。encode('unicode-escape')。decode('ascii')我更正了括号错误,并添加了一些代码以使函数具有所需的结果。这里的格式是将int转换为十六进制值,然后使用十六进制值手动生成unicodeThanks,我现在就知道了!
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