如何让Python 3正确处理MongoDB中的unicode字符串?

时间:2014-11-11 22:36:32

标签: mongodb python-3.x unicode pymongo

我正在使用Windows 7 64位,Python 3,MongoDB和PyMongo。我知道在Python 3中,所有字符串都是unicode。我也知道MongoDB将所有字符串存储为unicode。所以我不明白为什么当我从我的数据库中提取特定字段的值为“C:\ Some Folder \ E =mc².xyz”的文档时,Python会将该字符串视为“C:\ Some Folder \” E =mc².xyz”。它不仅仅是那种印刷方式; os.path.exists()返回False。现在,就好像这不够混乱,如果我将字符串保存到文本文件,然后使用显式设置为“utf-8”的编码打开它,字符串会正确显示,并且os.path.exists()返回True。出了什么问题,我该如何解决?

编辑: 这里是我刚写的一些代码来演示我的问题:

from pymongo import MongoClient

db = MongoClient().test_db
orig_doc = {'string': 'E=mc²'}
_id = db.test_col.insert(orig_doc)
new_doc = db.test_col.find_one(_id)
print(new_doc['string'])

>>> E=mc²

正如您所看到的,它完全正常工作!因此,我现在意识到,当我从PostgreSQL迁移时,我一定搞砸了。现在我只需要修复字符串。我知道这是可能的,但是必须有一种更好的方法,而不是将字符串写入文本文件然后再读回来。我可以这样做,就像我之前的测试一样,但它似乎不是正确的方式。

1 个答案:

答案 0 :(得分:0)

您无法存储Unicode。这是一个概念。 MongoDB必须使用Unicode编码,它看起来像UTF-8。 Python 3 Unicode字符串在内部存储为多种编码之一,具体取决于字符串的内容。您所拥有的是使用错误编码解码为Unicode的字符串:

>>> s='"C:\Some Folder\E=mc².xyz"'  # The invalid decoding.
>>> print(s)
"C:\Some Folder\E=mc².xyz"
>>> print(s.encode('latin1').decode('utf8'))  # Undo the wrong decoding, and apply the right one.
"C:\Some Folder\E=mc².xyz"

没有足够的信息告诉您如何正确读取MondoDB,但这可以帮助您。