我有一个 py3 字符串,其中包含转义的 utf-8 序列,例如“Company\\ffffffc2\\ffffffae”,我想将其转换为正确的 utf 8 字符串(在示例中为“Company® ",因为转义序列是 c2 ae)。我试过了
print (bytes("Company\\\\ffffffc2\\\\ffffffae".replace(
"\\\\ffffff", "\\x"), "ascii").decode("utf-8"))
结果:公司\xc2\xae
print (bytes("Company\\\\ffffffc2\\\\ffffffae".replace (
"\\\\ffffff", "\\x"), "ascii").decode("unicode_escape"))
结果:Company®
(错误,因为角色是分开对待的,但他们应该一起对待。
如果我这样做
print (b"Company\xc2\xae".decode("utf-8"))
它给出了正确的结果。 公司®
我如何以编程方式实现这一点(即从 py3 str 开始)
最佳答案
一个简单的解决方案是:
import ast
test_in = "Company\\\\ffffffc2\\\\ffffffae"
test_out = ast.literal_eval("b'''" + test_in.replace('\\\\ffffff','\\x') + "'''").decode('utf-8')
print(test_out)
但是,如果输入字符串本身中有三引号 '''
,则会失败。
下面的代码没有这个问题,但是没有第一个那么简单。
第一步,根据正则表达式分割字符串。奇数项是 ascii 部分,例如“公司”
;每个偶数项对应一个转义的 utf8 代码,例如“\\\\ffffffc2”
。每个子字符串根据其在输入字符串中的含义转换为字节。最后所有部分连接在一起并从字节解码为字符串。
import re
REGEXP = re.compile(r'(\\\\ffffff[0-9a-f]{2})', flags=re.I)
def convert(estr):
def split(estr):
for i, substr in enumerate(REGEXP.split(estr)):
if i % 2:
yield bytes.fromhex(substr[-2:])
elif substr:
yield bytes(substr, 'ascii')
return b''.join(split(estr)).decode('utf-8')
test_in = "Company\\\\ffffffc2\\\\ffffffae"
print(convert(test_in))
代码可以优化。 Ascii 部分不需要编码/解码,连续的十六进制代码应该连接起来。
关于python - 在python 3中将转义的utf-8字符串转换为utf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36548110/