2011-09-11 29 views
1

令人費解的是,我有兩個使用HTTP POST的函數,其中一個可以打破外部字符,我只需要執行self.request.POST.get('text')即可獲取兩個函數中的值。我看到的區別是,它在什麼地方破壞它繼承blobstoreuploadhandler因此,我懷疑它可能與這種變化有關。例如,我不明白爲什麼阿諾第一次工作,然後我做了一個看似不相關的變化,突然之間,任何非ASCII字符都被破壞了。在HTTP POST中使用gae python處理外來字符

請幫我理解python應該如何使用unicode和utf-8。

我有完整的2個代碼示例,其中一個可以工作,另一個可以像ÅÄÖ那樣扭曲外來字符,我只需要知道要更改哪些內容,我認爲應該可以進行調整以使其行爲與預期相符。

要準確理解問題的具體內容,可能有助於瞭解如果輸入ÅÄÖ,輸出將變爲xcTW,當它應該是ÅÄÖ時。

提到的2個代碼是

class AList(RequestHandler, I18NHandler): 
    ... 
    a.text = self.request.POST.get('text') 

上述工作。然後我改爲

class AList(RequestHandler, I18NHandler, blobstore_handlers.BlobstoreUploadHandler): 
    ... 
    a.text = self.request.POST.get('text') 

而這似乎是唯一的區別。我有兩個想法是用相同的應用程序部署2個例子,看看究竟是什麼導致了這個問題,因爲它可能會或可能不在我粘貼在這裏的代碼中。

而且,當本地外來字符按預期工作時,這也只是一個生產問題。

似乎由於以下通過電子郵件再現亂碼它關係到blobstoreuploadhandler的用法:

​​

回答

1

看起來你已經打了這個錯誤:http://code.google.com/p/googleappengine/issues/detail?id=2749

作爲一種變通方法,直到它得到解決,您可以使用JavaScript編碼所有的輸入用base64。這不是理想的,但它爲我做了伎倆。

+0

啊哈,已知的bug。補丁爲我工作,我只需將建議的代碼添加到'appengine_config.py',並且現在我的ÅÄÖ的viol現在也可以正確顯示 –

1

xcTW是基64編碼的那些3個字符的CP1252或latin1編碼的結果;看到下面的空閒會話:

>>> import base64; print repr(base64.b64decode('xcTW')) 
'\xc5\xc4\xd6' 
>>> print repr('ÅÄÖ') 
'\xc5\xc4\xd6' 
>>> 

但基本64編碼軋液ASCII字符,以及:

>>> base64.b64encode('abcdef') 
'YWJjZGVm' 
>>> 

看起來你需要尋找到傳輸編碼。

如果你不能解決這個問題,請嘗試發佈你的兩段代碼。

更新更多的思路的:一個「斑點」是二進制大對象,因此base64編碼,以確保它可以在可能不是8位乾淨的網絡進行傳輸。我不確定爲什麼你在使用斑點,如果你正在期待文字。如果你真的必須堅持第三個參數在那裏,那麼就對返回的字節使用base64.b64decode()。如果一切都失敗了,請閱讀gae文檔,看看是否有辦法關閉base 64編碼。

甚至更​​多ToT:blobhandler可能以ASCII碼發送,否則以base64編碼 - 這將符合報告的行爲。在這種情況下,你必須檢測編碼是什麼。我再說一遍:閱讀gae文檔。

+0

我更新了一些更詳細的問題,但它仍然可能不足以說明導致編碼問題的原因。 –

+1

如果您需要發佈文本字段以及文件(例如圖像及其標題),則可能需要使用BlobstoreUploadHandler處理文本。 –

+0

感謝您的幫助。現在起作用了。我可以通過添加評論21中的補丁來解決它:http://code.google.com/p/googleappengine/issues/detail?id=2749它說它是一個已知的錯誤。 –