【问题标题】:Python3: Decode UTF-8 bytes converted as stringPython3:解码转换为字符串的 UTF-8 字节
【发布时间】:2018-07-05 22:56:22
【问题描述】:

假设我有类似的东西:

a = "Gżegżółka"
a = bytes(a, 'utf-8')
a = str(a)

以形式返回字符串:

b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'

现在它作为简单的字符串发送(我从eval 函数得到它的断言)。我现在怎么能得到正常的 UTF-8 形式的起始词?如果有比str(bytes(x)) 更好的压缩,我会很高兴听到。

【问题讨论】:

  • 我不知道你所说的“我从eval函数中得到它的断言”是什么意思,但这听起来你在代码之外的代码中做的事情是一个非常糟糕的主意你给我们看的……

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


【解决方案1】:

如果您想对文本进行编码和解码,这就是 encodedecode 方法的用途:

>>> a = "Gżegżółka"
>>> b = a.encode('utf-8')
>>> b
b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'
>>> c = b.decode('utf-8')
>>> c
'Gżegżółka'

另外,请注意 UTF-8 已经是默认设置,因此您可以这样做:

>>> b = a.encode()
>>> c = b.decode()

您需要指定参数的唯一原因是:

  • 您需要使用其他编码而不是 UTF-8,
  • 您需要指定特定的错误处理程序,例如 'surrogatereplace' 而不是 'strict',或者
  • 您的代码必须在 Python 3.0-3.1(几乎没有人使用)中运行。

但是,如果你真的想,你可以做你已经在做的事情;您只需要在 str 调用中明确指定编码,就像在 bytes 调用中所做的那样:

>>> a = "Gżegżółka"
>>> b = bytes(a, 'utf-8')
>>> b
b'G\xc5\xbceg\xc5\xbc\xc3\xb3\xc5\x82ka'
>>> c = str(b, 'utf-8')
>>> c

在没有编码的情况下对bytes 对象调用str,就像您在做的那样,不会对其进行解码,也不会引发异常,例如在没有编码的情况下对str 调用bytes,因为str 的主要工作是为您提供对象的字符串表示形式——bytes 对象的最佳字符串表示形式是 b'…'

【讨论】:

    【解决方案2】:

    我找到了。将字节的字符串表示再次转换为字节的最简单方法是通过eval 语句:

    a = "Gżegżółka"
    a = bytes(a, 'utf-8')
    a = str(a) #this is the input we deal with
    
    a = eval(a) #that's how we transform a into bytes
    a = str(a, 'utf-8') #...and now we convert it into string
    
    print(a)
    

    【讨论】:

    • 正如@abarnert 评论的那样,您似乎正在尝试修复错误的代码,但如果您要这样做,至少使用ast.literal_eval instaed of eval
    • Welp,现在我发现我只是加载没有 utf-8 编码的脚本。但是,我仍然认为尝试破译 str(bytes(x)) 是一个有趣的问题:)
    • 我不知道您在说什么,您的问题中没有类似的内容。正如您发现的那样,您可以从其字符串表示中重建一个字节对象,但您不能对任意对象执行此操作,所以我想说一个更有趣的问题是您如何设法将自己描绘成那个角落以及如何避免它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2011-08-16
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多