【问题标题】:Why is python converting Kurdich characters into UTF-8 literals?为什么 python 将 Kurdich 字符转换为 UTF-8 文字?
【发布时间】:2016-01-01 21:09:28
【问题描述】:

我试图获取文本文件的内容并将其映射到 json 文件中,但我注意到 python 自动将 kurdish(sorani) 文本转换为 UTF-8 文字。有人可以解释为什么 python 会这样做,我该如何防止转换?

您可以使用以下代码对其进行测试:

def readText():
    # test.txt contains kurdish sorani characters (an article)
    # Sorani example: ڕۆژتان باش بەڕێزان. من ناوم ڕەنجە. 
    with open('test.txt', 'r') as context:
        data = context.readlines()
        return data
print(readText())

我在 Ubuntu 14.x 上运行 python 2.x。 Python2.x 做到了这一点! Python 3.x 不会对其进行转换并且工作正常。

【问题讨论】:

  • 你得到的输出是什么?像 \uXXXX 吗?
  • 您可以通过查看PYTHONIOENCODING 环境变量来解决您的问题:docs.python.org/2/using/cmdline.html
  • 输出如下:'\xd9\x87\xd8\xa7\xd9\x88\xd8'
  • 终端的输出在哪里?它运行的是什么版本的 Python?另外,请参阅我的答案以了解可能性。
  • @user3419211,你确定你使用的是 python3 吗?因为你不应该看到使用 python3.4 的 repr 表示

标签: python utf-8 non-ascii-characters


【解决方案1】:

当您调用 readlines 时,您会看到 repr 输出,它返回一个 list 并且列表显示数据的 repr 表示,一旦您实际打印字符串本身,您将看到实际str 输出,你也在使用 python2:

In [11]: out = readText()

In [12]: print out
['\xda\x95\xdb\x86\xda\x98\xd8\xaa\xd8\xa7\xd9\x86 \xd8\xa8\xd8\xa7\xd8\xb4 \xd8\xa8\xdb\x95\xda\x95\xdb\x8e\xd8\xb2\xd8\xa7\xd9\x86. \xd9\x85\xd9\x86 \xd9\x86\xd8\xa7\xd9\x88\xd9\x85 \xda\x95\xdb\x95\xd9\x86\xd8\xac\xdb\x95. ']

In [13]: print out[0]
ڕۆژتان باش بەڕێزان. من ناوم ڕەنجە. 

【讨论】:

  • 是的,只有当我给它一个索引时,这才是正确的。当我从文本文件 A 中读取文章并将其写入文本文件或 json 文件 B 时,这不起作用
【解决方案2】:

我将在这里尝试一下,并猜测您正在某种终端中读取输出,而当 Python 写入终端时,它会尝试以 ASCII 显示。

如果您将 PYTHONIOENCODING 环境变量设置为 UTF-8,这有时可以解决问题 - 它也取决于其他变量。

所以,如果您使用的是类 UNIX 系统,请在终端中尝试:export PYTHONIOENCODING=UTF-8

或者,对于 Windows,set PYTHONIOENCODING=UTF-8

然后,再次尝试运行您的脚本,看看是否打印了正确的字符。

更多信息可以在这里找到:How to print UTF-8 Encoded Text to the console in Python3

【讨论】:

  • 愿意解释反对意见吗?我不明白为什么真的有必要这样做。
  • 我没有对你投反对票,但这里有两个猜测 - 1) 你的回答不能解决问题。 2)您自己承认,这完全是猜测。我们应该在提供解决方案之前了解问题
  • @AlastairMcCormack 感谢您的建设性反馈,我将在此处保留我的答案,因为它可能有助于将来有人指出正确的方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2011-06-25
  • 2014-03-07
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多