【问题标题】:How can I get pymongo to always return str and not unicode?如何让 pymongo 始终返回 str 而不是 unicode?
【发布时间】:2013-08-08 20:04:03
【问题描述】:

来自 pymongo 文档:

MongoDB 以 BSON 格式存储数据。 BSON 字符串是 UTF-8 编码的,所以 PyMongo 必须确保 它存储的任何字符串都只包含有效的 UTF-8 数据。常规字符串 () > 已验证并按原样存储。 Unicode 字符串 () 首先是 UTF-8 编码的。 > 我们的示例字符串在 Python shell 中表示为 u'Mike' 而不是 “迈克”是 PyMongo 将每个 BSON 字符串解码为 Python unicode 字符串,而不是常规字符串 字符串。”

数据库只能存储 UTF-8 编码的字符串对我来说似乎有点傻,但是 pymongo 中的返回类型是 unicode,这意味着我对文档中的每个字符串做的第一件事就是再次调用 encode ('utf-8') 就可以了。有没有办法解决这个问题,即告诉 pymongo 不要把 unicode 还给我,而只给我原始的 str?

【问题讨论】:

  • 你为什么想要那个?
  • 我正在使用几个仅适用于编码字符串的库,例如bcrypt。很高兴能够向我的项目的开发人员保证他们正在使用的所有数据都是字符串,而不是必须添加大量的类型检查。
  • 问题在于“只是原始 str”。由于它是 unicode,因此那里可能存在无法表示为 str 的字符。所以lib级别的转换是不可行的。我只想告诉您的开发人员,他们将得到的一切都是 u"" 并且他们必须对其进行转换......这也可以为您节省不必要的转换开销。
  • UTF-8 维基百科条目的第一句话:“UTF-8(UCS 转换格式—8 位 [1])是一种可变宽度编码,可以表示 Unicode 字符中的每个字符放。”所以,事实上,所有的 unicode 都可以用 UTF-8 编码的原始字符串来表示。我们并没有真正解决我所问的问题。
  • 请记住,UTF-8 是 unicode 的一种实现编码,在此用于所有目的:UTF-8 == unicode。所以你在这里得到的是连贯的。 unicode 字符的原始字符串 == python 中的unicode 类型,而不是str。这是因为 str 可以代表 asci 字符,当然不是所有 unicode characters.

标签: pymongo


【解决方案1】:

不,PyMongo 中没有这样的功能;从 BSON 解码的每个字符串都被解码为 UTF-8。 Python 在内部将字符串表示为 UCS-2 或其他格式,具体取决于 Python 版本。请参阅code where the BSON decoder extracts a string

在即将推出的 PyMongo 3.x 系列中,我们可能会添加更灵活的 BSON 解码功能,以允许开发人员优化此类不常见的用例。

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2021-06-12
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多