如何在 Python 3 中执行 .decode('string-escape')?[重复]

2025-02-21 08:48:00
admin
原创
28
摘要:问题描述:我有一些转义字符串需要取消转义。我想在 Python 中执行此操作。例如,在 Python 2.7 中我可以这样做:>>> "\\123omething special".decode('string-escape') 'Something special' &...

问题描述:

我有一些转义字符串需要取消转义。我想在 Python 中执行此操作。

例如,在 Python 2.7 中我可以这样做:

>>> "\\123omething special".decode('string-escape')
'Something special'
>>> 

我如何在 Python 3 中做到这一点?这不起作用:

>>> b"\\123omething special".decode('string-escape')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
LookupError: unknown encoding: string-escape
>>> 

我的目标是能够获取如下字符串:

support@psiloc.com

并将其变成:

"support@psiloc.com"

完成转换后,我将探测我拥有的字符串是否以 UTF-8 或 UTF-16 编码。


解决方案 1:

您必须使用unicode_escape

>>> b"\\123omething special".decode('unicode_escape')

如果你从对象开始str(相当于 python 2.7 unicode),则需要先将其编码为字节,然后再使用 进行解码unicode_escape

如果您需要字节作为最终结果,则必须再次编码为合适的编码(.encode('latin1')例如,如果您需要保留文字字节值;前 256 个 Unicode 代码点 1-on-1 映射)。

您的示例实际上是带转义的 UTF-16 数据。从 解码unicode_escape,返回到latin1以保留字节,然后从utf-16-le(UTF 16 little endian without BOM):

>>> value = b's\\000u\\000p\\000p\\000o\\000r\\000t\\000@\\000p\\000s\\000i\\000l\\000o\\000c\\000.\\000c\\000o\\000m\\000'
>>> value.decode('unicode_escape').encode('latin1')  # convert to bytes
b'sx00ux00px00px00ox00rx00tx00@x00px00sx00ix00lx00ox00cx00.x00cx00ox00mx00'
>>> _.decode('utf-16-le') # decode from UTF-16-LE
'support@psiloc.com'

解决方案 2:

旧的“字符串转义”编解码器将字节串映射到字节串,并且关于如何处理此类编解码器存在很多争论,因此目前无法通过标准编码/解码接口使用它。

但是,代码仍然存在于 C-API 中(作为PyBytes_En/DecodeEscape),并且仍然通过未记录的codecs.escape_encode和向 Python 公开codecs.escape_decode

>>> import codecs
>>> codecs.escape_decode(b"ab\ÿ")
(b'abxff', 6)
>>> codecs.escape_encode(b"abxff")
(b'ab\ÿ', 3)

这些函数返回转换后的bytes对象,加上一个表示处理了多少字节的数字……您可以忽略后者。

>>> value = b's\\000u\\000p\\000p\\000o\\000r\\000t\\000@\\000p\\000s\\000i\\000l\\000o\\000c\\000.\\000c\\000o\\000m\\000'
>>> codecs.escape_decode(value)[0]
b'sx00ux00px00px00ox00rx00tx00@x00px00sx00ix00lx00ox00cx00.x00cx00ox00mx00'

解决方案 3:

如果您想要对转义序列进行str -to- str解码,那么输入和输出都是 Unicode:

def string_escape(s, encoding='utf-8'):
    return (s.encode('latin1')         # To bytes, required by 'unicode-escape'
             .decode('unicode-escape') # Perform the actual octal-escaping decode
             .encode('latin1')         # 1:1 mapping back to bytes
             .decode(encoding))        # Decode original encoding

测试:

>>> string_escape('\\123omething special')
'Something special'

>>> string_escape(r'support@'
                  r'psiloc.com',
                  'utf-16-le')
'support@psiloc.com'

解决方案 4:

py2

"\\123omething special".decode('string-escape')

py3

"\\123omething special".encode('utf-8').decode('unicode-escape')

解决方案 5:

您不能unicode_escape在字节字符串上使用(或者更确切地说,您可以,但它并不总是返回与string_escapePython 2 上相同的内容)——小心!

该函数string_escape使用正则表达式和自定义替换逻辑实现。

def unescape(text):
    regex = re.compile(b'\\\\(\\\\|[0-7]{1,3}|x.[0-9a-f]?|[\'"abfnrt]|.|$)')
    def replace(m):
        b = m.group(1)
        if len(b) == 0:
            raise ValueError("Invalid character escape: '\\'.")
        i = b[0]
        if i == 120:
            v = int(b[1:], 16)
        elif 48 <= i <= 55:
            v = int(b, 8)
        elif i == 34: return b'"'
        elif i == 39: return b"'"
        elif i == 92: return b'\\'
        elif i == 97: return b'a'
        elif i == 98: return b''
        elif i == 102: return b''
        elif i == 110: return b'
'
        elif i == 114: return b'
'
        elif i == 116: return b'    '
        else:
            s = b.decode('ascii')
            raise UnicodeDecodeError(
                'stringescape', text, m.start(), m.end(), "Invalid escape: %r" % s
            )
        return bytes((v, ))
    result = regex.sub(replace, text)

解决方案 6:

至少对我来说这是等效的:

Py2: my_input.decode('string_escape')
Py3: bytes(my_input.decode('unicode_escape'), 'latin1')

convertutils.py:

def string_escape(my_bytes):
    return bytes(my_bytes.decode('unicode_escape'), 'latin1')
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用