【问题标题】:python print utf-8 character stored in unicode stringpython打印存储在unicode字符串中的utf-8字符
【发布时间】:2017-08-03 12:49:36
【问题描述】:

我正在阅读从某个库中检索到的泡菜文件。 unicode 字符串中存储了很多 utf-8 字符。例如:

u'\xc4\x91' #đ
u'\xc3\xad' #í
u'\xc3\u017d' #�\u017d
...

我可以使用raw_unicode_escape 对它们中的大部分进行编码和显示 但是,所有带有\u 转义的字符(如上面第三个)都无法正确显示:�\u017d。我该如何解决? 编辑: 上面的每个字符串都应该是一个字符

编辑 2:我用来读取文件的代码

model_dir = '../../projects/python/test/model-5'
with open(model_dir, 'rb') as f:
    model = pickle.load(f)
seq = model.sequitur
rightI = seq.rightInventory
print repr(rightI.list) 

结果包含与上述示例类似的内容

【问题讨论】:

  • 不正确是什么意思?你能举个例子吗?
  • 也许你的控制台编码有问题?尝试将输出写入文件而不是标准输出。
  • @LaurynasTamulevičius 我刚刚根据您的要求添加了
  • @damians 我确实尝试将其写入文件,实际上我的初衷是通过文件工作,但它不起作用。有很多 utf-8 字符,但只有 \u 的字符有问题
  • 你能发布一个不起作用的 MCVE 吗?

标签: python unicode encoding utf-8


【解决方案1】:

不妨试试这个

PYTHONIOENCODING="utf8" python script.py

【讨论】:

    【解决方案2】:

    你有一个 unicode 转义字符串。如果您打印它,并且您的控制台的字体和编码支持它,您将看到以下内容:

    >>> sys.stdout.encoding
    'UTF-8'
    >>> sys.getfilesystemencoding()
    'UTF-8'
    >>> i
    [u'\xc4\x91', u'\xc3\xad', u'\xc3\u017d']
    >>> for q in i:
    ...   print(q)
    ...
    Ä
    í
    ÃŽ
    

    为确保它们正确呈现(打印在屏幕上),您需要确保:

    • 文件的编码对于文件中输入的数据是正确的。
    • 终端的编码和字体支持字形

    如果您看到 �,则表示为应用程序声明的编码不支持该特定代码点,因此系统不知道如何呈现它。

    【讨论】:

    • 你可能误解了我的意思。当我说我有 utf-8 字符存储在 unicode 字符串中时,我的意思是它应该是 '\xc4\x91' (没有前缀 u)但是从泡菜加载后,它们变成了 unicode,所以为了正确打印它们,我必须使用encode(raw_unicode_escape) 将它们转换回str。而且我可以保证终端能够显示该字符,我只是认为编码在某个地方搞砸了。
    • @ATheS21 那么您进行了错误的转换。这不是你应该做的。
    • @BurhanKhalid 我认为sys.getfilesystemencoding() 是关于系统上文件名的编码。它可能与输入/输出编码不同。还有sys.stdout.encoding。
    • @Gribouillis 你能详细说明一下吗?当我发现所有这些字符都是 unicode 并且无法打印它们时,我四处搜索,发现 raw_unicode_escape 解决方案在大多数情况下都有效。我不是很了解它
    • @ATheS21 在文档中,raw_unicode_escape 用于创建可以在 python 代码中作为 unicode literal 使用的字符串。它非常特定于 python 源代码。这里真正的问题是我们不知道您的数据来自哪里。您是否在没有 pickle 模块的情况下读取了腌制文件,或者它是产生这些字符串的未腌制对象?您知道哪些 unicode 代码点对应于您的数据吗?最好的办法是解释你是如何获得数据的以及你想用它做什么。
    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2021-08-13
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多