2013-11-09 67 views
0

我試圖編寫一個簡單的聊天系統,它接受各種語言並自動翻譯它們,在它旁邊同時打印原始語言和第二種語言(例如英語) 。Python 2.6.6 Ubuntu服務器os.environ not unicode

但是,我遇到了問題沒有結束,我認爲,原因是因爲Python讀取os.environ作爲ASCII字符串,而不是Unicode。我需要能夠從unicode,utf-8中的Apache中檢索QUERY STRING環境變量,以便我可以實際獲取不同字符集中的文本。現在,他們都顯示爲?s。

有反正我可以改變這個,所以python可以讀取unicode中的os.environ?這是Apache,Linux或Python本身的問題嗎?我已經搜索了幾個小時的谷歌現在,大多數的答案都是關於Python 3,我很猶豫升級到(但如果沒有其他選擇的話)。

我有Apache覆蓋所有字符集爲utf-8,所以我的所有頁面都強制這樣。

這是我非常簡單的測試HTML:

<form action=exec/post.py method=post><input type=text name='a'><input type=submit></form> 

,這是它調用post.py:

#!/usr/bin/python 
import os 
import urllib2 

print "Content-Type: text/html; charset=utf-8" 
print 
for key,value in os.environ.items(): 
     print key + ":"+ str(type(value)) 

然後,如果你看的輸出源,它將顯示類型爲str,而不是unicode。

回答

0

沒有必要爲此升級到Python 3。您需要解碼字符串以獲取Unicode值。這將顯示所有值現在爲unicode

for key,value in os.environ.items(): 
    print key + ":"+ str(type(value.decode("utf-8"))) 
+0

嗯......所以,你是對的。我花了一段時間才意識到這一點,因爲出於某種原因,如果你明確地鍵入了URI(嗯,IRI),它仍然會以???的形式出現,但是如果我提交表單,它確實會轉換成Unicode。 Chrome瀏覽器會讓我明確地鍵入它,但IE和Opera不這樣做。任何想法爲什麼?奇怪的原因是我可以去谷歌翻譯,並在IRI中輸入不同的字符,就可以在那裏使用。這不是必需的功能,但它會很好! – Keozon

+0

@Keozon我知道當你輸入URI時,你會詢問出現在*瀏覽器字段*中的問號。如果我理解正確,那麼這是一個瀏覽器問題,而不是Python。它可能還取決於您的操作系統,因爲操作系統通常會嚮應用程序提供語言支持。 – Louis

+0

不,我的意思是如果我刪除類型()並只是查看實際值,當我通過表單提交時,它很好,但如果我在瀏覽器欄中鍵入它(例如post.py?a =текст)它將顯示爲???,但僅限於某些瀏覽器。如果我得到谷歌,做同樣的事情,所有的瀏覽器在那裏工作(例如,http://translate.google.com/#ru/en/текст) – Keozon

0

os.environ總是隻有字節,正如URL和查詢字符串一樣。

你需要在自己的代碼這樣的信息進行解碼:

print u'{0}: {}'.format(key, value.decode('utf8')) 

這是根本如何流(網絡連接,文件,管道等)工作;它們總是包含字節。這些字節可以用不同的方式解釋,如果它們包含Unicode值,則需要對它們進行明確解碼。

+0

感謝您的快速響應。我已經嘗試過了,但我又做了,並且複製了你,以確保我沒有遺漏任何東西。我仍然是?????而不是текст。 – Keozon

+0

對不起,你是對的。在Louis的答案中看到解釋/問題。 – Keozon

+0

請注意,這兩種方式都有效;發送回瀏覽器需要您再次編碼。 –