【问题标题】:How to convert byte string to character with correct escaping?如何将字节字符串转换为具有正确转义的字符?
【发布时间】:2019-02-19 21:53:38
【问题描述】:

我想不通,为什么解码失败,如果字节字符串以十六进制 a、b、c、d、e 或 f 开头,而不是数字,总是有两个反斜杠而不是一个。

>>> bstr = b'\xfb'
>>> bstr.decode('utf8', 'backslashreplace')
'\\xfb'

我想要的是 '\xfb'。

但是,

>>> bstr = b'\x1f'
>>> bstr.decode('utf8', 'backslashreplace')
'\x1f'

按预期工作。你知道怎么回事吗?

【问题讨论】:

  • b'\xfb' 不是'\xfb' 的UTF-8 编码。以 UTF-8 解码该字节串不应导致 '\xfb'。您处理编码的方式根本错误。
  • 请问,如何解码字节串得到预期的结果?
  • 您的期望是错误的。你可以做一件会得到你期望的结果的事情,但这样做很可能是错误的。你需要弄清楚自己应该做什么,即使事实证明你应该做的事情并没有产生你目前期望的结果。

标签: python python-3.x utf-8


【解决方案1】:

b'\xfb' 是一个包含单个字节的字节串。该字节具有十六进制值 FB,或十进制的 251。

'\xfb' 是一个包含单个 Unicode 代码点的字符串。该代码点是带有 CIRCUMFLEX 的 U+00FB 拉丁小写字母 U,或 û

b'\xfb' 不是 '\xfb' 的 UTF-8 编码。 '\xfb'的UTF-8编码为b'\xc3\xbb'

>>> '\xfb'.encode('utf-8')
b'\xc3\xbb'

事实上,b'\xfb' 根本不是任何东西的 UTF-8 编码,尝试将其解码为 UTF-8 是错误的。 'backslashreplace' 指定了一种处理该错误的方法,其中 FB 字节被替换为字符序列反斜杠-x-f-b。

虽然可以执行将b'\xfb' 转换为'\xfb' 的操作,但该转换与UTF-8 无关,并且在没有明确要求的情况下应用该转换只会导致更多问题。你需要弄清楚你的程序实际上需要做什么。最有可能的是,正确的前进道路不涉及任何b'\xfb''\xfb' 的转换。我们无法告诉您需要做什么,因为我们缺少很多上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多