Вопрос по python, utf-8, unicode, google-app-engine – Google App Engine TextProperty и UTF-8: когда кодировать / декодировать

3

Я использую Google App Engine 2.5 с шаблоном Django и рамкой веб-приложения.

Db.TextProperty и UTF-8, а также Unicode и Decode / Encode меня сильно смутили. Я был бы очень признателен, если бы некоторые эксперты могли предложить некоторые предложения. Я гуглил всю ночь и у меня все еще так много вопросов.

Что я пытаюсь сделать:

[utf-8 form input] => [Python, Store in db.TextProperty] => [When Needed, Replace Japanese with English] => [HTML, UTF-8]

Согласно этому ответуСжатие строк Юникода в Python

# -*- coding: utf-8 -*-

и все файлы .py, сохраненные в формате utf-8

Вот мой код:

#Model.py
class MyModel(db.Model):
  content = db.TextProperty()

#Main.py
def post(self):
    content=cgi.escape(self.request.get('content'))
    #what is the type of content? Unicode? Str? or Other?
    obj = MyModel(content=content)
    #obj = MyModel(content=unicode(content))
    #obj = MyModel(content=unicode(content,'utf-8'))
    #which one is the best?
    obj.put()

#Replace one Japanese word with English word in the content
content=obj.content
#what is the type of content here? db.Text? Unicode? Str? or Other?
#content=unicode(obj.content, 'utf-8') #Is this necessary?
content=content.replace(u'ひと',u'hito')

#Output to HTML
self.response.out.write(template.render(path, {'content':content})
#self.response.out.write(template.render(path, {'content':content.encode('utf-8')})

Надеюсь, что какой-нибудь инженер Google App Engine сможет увидеть этот вопрос и предложить некоторую помощь. Большое спасибо!

Вы не должны (или хотите) звонитьcgi.escape, Когда-либо. Nick Johnson
@ Ник, а? Не нужно использоватьcgi.escape? поэтому, пожалуйста, скажите мне: что этоself.response.out.write(cgi.escape(self.request.get('content')))  отdevelopers.google.com/appengine/docs/python/gettingstarted/… Susan Mayer
Привет Сьюзен. Интересная проблема, но вы можете указать больше деталей, например, какую кодировку вы используете для хранения данных и на каком языке, английском или японском? Если это японский язык, вы используете UTF-8 или что-то еще? Вы всегда принимаете ввод в формате UTF-8 или это смешивание и сопоставление? Любая дополнительная информация, которую вы можете предоставить, может помочь вам получить ответ. Удачи! jmort253
@ jmort253 Я намерен держать все вUTF-8 формат. HTML-форма находится вUTF-8 сcharset=utf-8 и никакие другие кодировки не используются. Susan Mayer
В качестве отправной точки, вы можете использовать встроенную функциюtype получитьcontent тип переменной:type(content) скажет вам тип, возвращаемыйcgi.escape Boud

Ваш Ответ

2   ответа
0

Пытаться

db.Text("text", encoding="utf-8")

это помогает мне сохранить текст utf-8 в TextProperty ()

подробности см. по следующей ссылке: https://developers.google.com/appengine/docs/python/datastore/typesandpropertyclasses?hl=en#Text

1

прочитай это. И это.

Одним словом, всякий раз, когда вы имеете дело с текстовой строкой в своем приложении, это должна быть строка в кодировке Юникод. Вы должны кодировать в байтовую строку (экземпляр «str» вместо «unicode»), когда вы хотите отправлять данные в байтах - например, по HTTP, и вы должны декодировать из байтовой строки, когда вы получаете байты, которые представлять текст (и вы знаете их кодировку). Единственные операции, которые вы должны когда-либо выполнять над байтовой строкой, содержащей кодированный текст, - это их декодирование или кодирование.

К счастью, большинство фреймворков понимают это правильно; Например, webapp и webapp2 (я вижу, вы используете webapp) должны возвращать строки Юникода из всех методов запроса и кодировать любые строки, которые вы им передаете, соответствующим образом. Убедитесь, что все строки, за которые вы отвечаете, являются Unicode, и с вами все должно быть в порядке.

Обратите внимание, что в байтовой строке может храниться любой кодированный в виде данных текст, исполняемый файл, изображение, случайные байты, зашифрованные данные и т. Д. Без метаданных, таких как знание о том, что это текст, и в какой кодировке он находится, вы не можете разумно ничего с ним делать, кроме как сохранять и извлекать его.

Никогда не пытайтесь декодировать строку в юникоде или кодировать строку байтов; это не будет делать то, что вы ожидаете, и все пойдет ужасно неправильно.

Что касается хранилища данных,db.Text это подклассunicode; во всех смыслах и целях этоis строка Unicode - она отличается только от хранилища данных, и она может сказать, что она не должна быть проиндексирована. Точно так же,db.Blob это подклассstr, для хранения байтовых строк.

Похожие вопросы