【问题标题】:properly converting special chars in python byte string正确转换 python 字节字符串中的特殊字符
【发布时间】:2020-11-19 06:45:06
【问题描述】:

尝试浏览了一些类似的线程,但仍然感到困惑:

我有一个带有一些特殊字符的字节字符串(在我的例子中是双引号),如下所示。将其正确转换为字符串以便正确映射特殊字符的最简单方法是什么?

b = b'My groovy str\xe2\x80\x9d is now fixed'

更新:关于 decode('utf-8')

>>> b = b'My groovy str\xe2\x80\x9d is now fixed'
>>> b_converted = b.decode("utf-8") 
>>> b_converted
'My groovy str\u201d is now fixed'
>>> print(b_converted)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u201d' in position 13: ordinal not in range(128)

【问题讨论】:

    标签: python string python-unicode


    【解决方案1】:

    以下应该有效:

    b_converted = b.decode("utf-8") 
    

    转换自:

    b'My groovy str\xe2\x80\x9d is now fixed'
    

    收件人:

    My groovy str” is now fixed
    

    【讨论】:

    • 这适用于问题中包含的特定示例,但重要的是要注意有很多不同的选择可以传递给encode。您确实需要知道字节字符串的来源才能知道正确的参数。
    • 这是我得到的:>>> b.decode('utf-8') '我的 groovy str\u201d 现在已修复'
    • Python 3.6,但它在 2.7 中也不适用于我。难道是因为我输入了那些特殊字符?
    • 我认为你是对的 - 当我导出 LC_ALL=C.UTF-8 时,我得到了一些有趣的行为
    • '\u201d' == '”'。显示的区别在于,在 Python3 上,如果 Unicode 是可打印字符终端支持的编码,它将打印该字符,否则它将在repr() 字符串中显示转义码。在 Python 2 上,只有 ASCII 可打印字符未被转义。当你实际上print 到终端时,你会得到str() 被使用,如果字符不能在终端的编码中打印,则不可打印字符给UnicodeEncodeError
    【解决方案2】:

    在字节字符串上使用 .decode(<i>encoding</i>) 将其转换为 Unicode。

    编码并不总是确定的,取决于来源。在这种情况下,显然是utf8

    理想情况下,在读取文本字符串时,用于读取数据的 API 可以指定编码,或者在网站请求的情况下从响应标头中检测它,因此您不需要显式地 .decode,例如:

    with open('input.txt',encoding='utf8') as file:
        text = file.read()
    

    import requests
    response = requests.get('http://example.com')
    print(response.encoding)
    print(response.text) # translated from encoding
    

    【讨论】:

    • 谢谢,请看我上面的评论。也许它不起作用 b/c 解码不会转义特殊字符,但 'unicode escape' 对我也不起作用
    • @LazyCat 那是因为你的执行环境。您的输出终端使用不支持所有 Unicode 字符的代码页。 print 正在使用 ascii 编解码器将 Unicode 字符串 编码 到终端。你在什么下运行 Python(例如,“Windows 10 64 位,cmd.exe 终端”)。
    • 谢谢,只是在普通的linux下,所以没想到会出现这样的问题
    • @LazyCat 需要明确的是,.decode() 正在工作,print 正在对终端执行.encode('ascii') 并且失败。这表明终端没有为 UTF-8 正确配置。我没有使用 Linux,但 IIRC Python 使用 LC_ALL 环境变量来检测终端编码。这是一个与您最初的问题不同的问题,并且有很多关于 SO 处理 print 问题的现有答案。
    • 试试export LC_ALL='en_US.utf8'
    猜你喜欢
    • 2020-01-10
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2011-05-11
    • 2014-07-22
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多