gpt4 book ai didi

python - App Engine 中 BlobStore 的 Unicode 字符

转载 作者:行者123 更新时间:2023-11-28 22:05:19 25 4
gpt4 key购买 nike

有没有一种方法可以使用 App Engine 的 BlobStore(在 Python 中)存储 unicode 数据?

我正在这样保存数据

file_name = files.blobstore.create(mime_type='application/octet-stream')
with files.open(file_name, 'a') as f:
f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')

但是在生产(而非开发)服务器上我遇到了这个错误。它似乎正在将我的 Unicode 转换为 ASCII,我不知道为什么。

为什么要尝试转换回 ASCII?我可以避免这种情况吗?

    Traceback (most recent call last):
File "/base/data/home/apps/myapp/1.349473606437967000/myfile.py", line 137, in get
f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 364, in write
self._make_rpc_call_with_retry('Append', request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 472, in _make_rpc_call_with_retry
_make_call(method, request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file.py", line 226, in _make_call
rpc.make_call(method, request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 509, in make_call
self.__rpc.MakeCall(self.__service, method, request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 115, in MakeCall
self._MakeCallImpl()
File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 161, in _MakeCallImpl
self.request.Output(e)
File "/base/python_runtime/python_lib/versions/1/google/net/proto/ProtocolBuffer.py", line 204, in Output
self.OutputUnchecked(e)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/files/file_service_pb.py", line 2390, in OutputUnchecked
out.putPrefixedString(self.data_)
File "/base/python_runtime/python_lib/versions/1/google/net/proto/ProtocolBuffer.py", line 432, in putPrefixedString
v = str(v)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 313: ordinal not in range(128)

最佳答案

BLOB 存储包含二进制数据:字节,而不是字符。所以你将不得不做某种编码步骤。 utf-8看起来和任何编码一样好。

f.write('<as><a>' + '</a><a>'.join(stringInUnicode) + '</a></as>')

如果 stringInUnicode 中的项目会出错包含 < , &]]>序列。您需要进行一些转义(使用适当的 XML 库序列化数据,或手动):

with files.open(file_name, 'a') as f:
f.write('<as>')
for line in stringInUnicode:
line= line.replace(u'&', u'&amp;').replace(u'<', u'&lt;').replace(u'>', u'&gt;');
f.write('<a>%s</a>' % line.encode('utf-8'))
f.write('</as>')

(如果字符串包含控制字符,这仍然是格式错误的 XML,但是您对此无能为力。如果您需要在 XML 中存储任意二进制文件,则需要一些特殊编码,例如作为顶部的 base-64。)

关于python - App Engine 中 BlobStore 的 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com