python - 在python 3中将转义的utf-8字符串转换为utf

标签 python encoding utf-8

我有一个 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/

相关文章:

python - 如何更改文件中字符的编码

ios - 谁能告诉我如何在 Objective-c 中将 UTF-8 值转换为 UCS-2 值?

python - 如何加快 Levenshtein 距离计算

python - 模型 View 设计中的属性

git - 什么会导致 git 混淆字符编码?

encoding - 我如何在 Golang 中将一个 16 位整数写入多个字节?

python - 如何在对象列表中搜索属性?

python - 使用Python将OpenCV cv.Rectangle(img,pt1,pt2)转换为NumPy数组

c - 反转 7 位整数编码

xml - 为什么外籍人士拒绝破折号字符无效?