为了账号安全,请及时绑定邮箱和手机立即绑定

我如何在Python3中使用.decode('string-escape')?

我如何在Python3中使用.decode('string-escape')?

吃鸡游戏 2019-08-09 09:48:25
我如何在Python3中使用.decode('string-escape')?我有一些需要转义的转义字符串。我想用Python做这件事。例如,在python2.7中,我可以这样做:>>> "\\123omething special".decode('string-escape')'Something special'>>>我如何在Python3中完成它?这不起作用:>>> b"\\123omething special".decode('string-escape')Traceback (most recent call last):   File "<stdin>", line 1, in <module>LookupError: unknown encoding: string-escape>>>我的目标是成为一个像这样的字符串:s\000u\000p\000p\000o\000r\000t\000@\000p\000s\000i\000l\000o\000c\000.\000c\000o\000m\000把它变成:"support@psiloc.com"在进行转换之后,我将探测我的字符串是用UTF-8还是UTF-16编码的。
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

你必须使用unicode_escape:


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

如果你从一个str对象开始(相当于python 2.7 unicode),你需要首先编码为字节,然后解码unicode_escape。


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


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


>>> 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's\x00u\x00p\x00p\x00o\x00r\x00t\x00@\x00p\x00s\x00i\x00l\x00o\x00c\x00.\x00c\x00o\x00m\x00'

>>> _.decode('utf-16-le') # decode from UTF-16-LE

'support@psiloc.com'


查看完整回答
反对 回复 2019-08-09
?
噜噜哒

TA贡献1784条经验 获得超7个赞

你不能使用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'\b'
        elif i == 102: return b'\f'
        elif i == 110: return b'\n'
        elif i == 114: return b'\r'
        elif i == 116: return b'\t'
        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)


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 4887 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信