【问题标题】:Python 3 - String with \xHH Hex Values to UnicodePython 3 - 字符串与 \xHH 十六进制值到 Unicode
【发布时间】:2017-08-04 08:06:12
【问题描述】:

我正在尝试使用需要多个十六进制值的字符来转换字符串,如下所示:

'Mahou Shoujo Madoka\xe2\x98\x85Magica'

到它的 unicode 表示:

'Mahou Shoujo Madoka★Magica'

当我打印字符串时,它会尝试分别评估每个十六进制值,所以默认情况下我得到这个:

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
print(x)

Mahou Shoujo MadokaâMagica

所以我尝试了其他一些 StackOverflow 答案,例如Best way to convert string to bytes in Python 3?:

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
z = x.encode('utf-8')
print('z:', z)
y = z.decode('utf-8')
print('y:', y)

z: b'Mahou Shoujo Madoka\xc3\xa2\xc2\x98\xc2\x85Magica'
y: Mahou Shoujo MadokaâMagica

Python: Convert Unicode-Hex-String to Unicode:

z = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
x = binascii.unhexlify(binascii.hexlify(z.encode('utf-8'))).decode('utf-8')
print('x:', x)

x: Mahou Shoujo MadokaâMagica

还有一些其他的,但没有一个起作用。我发现的大多数结果都是拥有double backslash problem 的人,但他们都没有我的确切问题。

我注意到的是,当我执行 str.encode 时,它​​似乎在二进制文件中添加了一些额外的值(例如第一次尝试时 z 和 x 之间的差异),我不太清楚为什么。

所以我尝试手动将字符串的字符输入到二进制文件中:

x = b'Mahou Shoujo Madoka\xe2\x98\x85Magica'
x.decode('utf-8')

'Mahou Shoujo Madoka★Magica'

它奏效了。但是我找不到一种方法来将字符串从字面上转换为二进制,而不是把它输入出来。我哪里错了?

【问题讨论】:

    标签: python-3.x hex unicode-string unicode-escapes


    【解决方案1】:

    在 Python 3 中,您的原始字符串是 Unicode 字符串,但包含的 Unicode 代码点看起来像 UTF-8,但解码不正确。修复它:

    >>> s = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
    >>> type(s)
    <class 'str'>
    >>> s.encode('latin1')
    b'Mahou Shoujo Madoka\xe2\x98\x85Magica'
    >>> s.encode('latin1').decode('utf8')
    'Mahou Shoujo Madoka★Magica'
    

    latin1 编码恰好将 1:1 映射到 Unicode 中的前 256 个代码点,因此.encode('latin1') 将代码点直接转换回字节。然后你可以正确地.decode('utf8')字节。

    【讨论】:

    • 要将字符串分配给变量,您也可以将上面的内容缩短为s = b"\xe2\x98\x85".decode("utf8")
    • @Jens 您可以将其缩短为 s='★' 但这不是问题的重点。
    猜你喜欢
    • 2014-12-28
    • 2012-08-15
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2014-12-22
    相关资源
    最近更新 更多