除了PyYAML,还有没有安全的Python数据序列化库可以正确处理 unicode
str
?
例如:?
>>> json.loads(json.dumps([u"x", "x"]))
[u'x', u'x'] # Both unicode
>>> msgpack.loads(msgpack.dumps([u"x", "x"]))
['x', 'x'] # Neither are unicode
>>> bson.loads(bson.dumps({"x": [u"x", "x"]}))
{u'x': [u'x', 'x']} # Dict keys become unicode
>>> pyamf.decode(pyamf.encode([u"x", "x"])).next()
[u'x', u'x'] # Both are unicode
注意,我希望序列化器是 安全的 (所以 pickle
和 marshel
都出来了),PyYAML是一个选项,但我不喜欢YAML的复杂性,所以我想知道是否还有其他选项。
编辑说明:似乎对我的数据的性质有一些混淆。有些数据是Unicode(如名称),有些是二进制(如图像)......因此,一个序列化库会让人感到困惑。unicode
和 str
对我来说,就像一个图书馆一样没有用处,因为它混淆了我的注意力。"42"
和 42
.
你有没有试过 伯特?
>>> import bert
>>> bert.decode(bert.encode([u"x", "x"]))
[u'x', 'x']
>>> bert.decode(bert.encode({"x":[u"x", "x"]}))
{'x': [u'x', 'x']}
(要安装的话,你得先手动安装erlastic,因为有了 这个悬而未决的拉请求)
也许就用Python的 repr
来存储该值,并使用 天文.literal_eval
方法的时候,我发现 msgpack-python 0.4 现在支持 strunicode 的 use_bin_typeencoding 参数。
In [7]: ast.literal_eval (repr({"d": ["x", u"x"]}))
Out[7]: {'d': ['x', u'x']}
我也在寻找同样的东西,我发现msgpack-python 0.4现在支持strunicode的使用_bin_typeencoding参数。
>>> msgpack.unpackb(msgpack.packb(["uu\x00u", u"adsa\xe4"], use_bin_type=True, encoding="utf-8"), encoding="utf-8")
['uu\x00u', u'adsa\xe4']