首页 > 解决方案 > UnicodeEncodeError - 如何在 python 3 中输出俄语字符

问题描述

我正在尝试使用 pymongo 查询 MongoDB 数据库中的数据。集合中的某些文档具有俄语字符作为值,例如“Л”、“о”或“ч”。每当我查询具有此类字符的文档时,我都会得到以下输出:

>>> pprint(db.mycollection.find_one({}))

{
  "_id" : ObjectId('123456')
  "name" : Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
}

起初,我认为“名称”值只是损坏了。因此,我登录到 MongoDb Atlas/Compass 并通过“_id”搜索用户。(在上面的例子中,我会搜索 ObjectId('123456')),它成功地返回了带有俄语字符名称值的文档。我在 stackoverflow 上环顾四周,并尝试使用 utf8 和 cp1252 进行不同的编码和解码链,但我仍然遇到同样的错误。有人对可能发生的事情有任何想法吗?

更新:程序在 Windows 终端上运行并正确显示俄语字符。但是,我想探索如何使用 sublime 构建它。这是我用来编译 sublime 的 python3.sublime-build:

{
    "cmd": ["C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python39\\python.exe", "-u", "$file"],

    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",

    "selector": "source.python"
}

另外, print(sys.stdout.encoding) 输出使用 sublime 编译的 cp1252,但它在 windows 终端中输出 utf-8 编译。

标签: python-3.xmongodbpython-unicode

解决方案


在 sublime-build 中添加两行对我有用:

{
  "cmd": ["python", "-u", "$file"],
  "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
  "selector": "source.python",
  "encoding": "utf8",
  "env": {"PYTHONIOENCODING": "utf-8", "LANG": "en_US.UTF-8"},
}

推荐阅读