2012-06-03 70 views
0

我目前在Linux(Ubuntu)下編碼/編碼有嚴重問題。我以前從來沒有必要處理這個問題,所以我不知道爲什麼這實際上不起作用!解碼/編碼問題

我從/usr/share/applications/解析*.desktop文件,並提取通過HTTPServer顯示在Web瀏覽器中的信息。我正在使用jinja2進行模板。

首先,我在呼叫jinja2.Template.render()裏面說,

utf-8 cannot decode character XXX at position YY [...] 

所以我提出,來自我appfind - 模(其解析*.desktop文件)的所有值只返回了Unicode的字符串中接收UnicodeDecodeError

到目前爲止,這個地方的問題已經解決了,但是在某些時候,我正在寫一個函數返回的字符串到BaseHTTPServer.BaseHTTTPRequestHandler.wfile插槽,並且我無法修復這個錯誤,無論使用什麼編碼。

此時,寫入wfile的字符串來自jinja2.Template.render(),afaik返回一個unicode對象。

的離奇的部分是,它工作在我的Ubuntu 12.04 LTS卻沒有關於我的朋友的的Ubuntu LTS 11.04。但是,這可能不是原因。他有更多的應用程序,也許他們使用編碼在他們的*.desktop文件中引發錯誤。

不過,我適當的檢查在*.desktop文件的編碼:

data = dict(parser.items('Desktop Entry')) 

try: 
    encoding = data.get('encoding', 'utf-8') 
    result = { 
     'name':  data['name'].decode(encoding), 
     'exec':  DKENTRY_EXECREPL.sub('', data['exec']).decode(encoding), 
     'type':  data['type'].decode(encoding), 
     'version': float(data.get('version', 1.0)), 
     'encoding': encoding, 
     'comment': data.get('comment', '').decode(encoding) or None, 
     'categories': _filter_bool(data.get('categories', ''). 
             decode(encoding).split(';')), 
     'mimetypes': _filter_bool(data.get('mimetype', ''). 
             decode(encoding).split(';')), 
    } 

# ... 

可有人請賜教,我怎麼能解決這個問題?我已閱讀上,這樣我應該使用unicode()總是一個答案,但是這將是這麼多的痛苦實施,並寫入wfile的時候,我不認爲這將解決這一問題?

感謝,
尼克拉斯

+1

當你試圖寫入'wfile'時,你會得到什麼錯誤? – JAB

回答

3

這可能是顯而易見的,但無論如何:當寫入它編:wfile是一個普通的字節流:家居書面必須unicode.encode()。

閱讀OP,這我也不清楚到底什麼是在進行中。但是,有一些技巧可以幫助你,我發現它有助於調試編碼問題。如果這是你早已超越的東西,我提前道歉。

  • cat -v上的文件將輸出所有非ASCII字符爲「^ X」,這是唯一的十分簡單的方法,我發現來決定什麼編碼的文件真的有。 UTF-8非ASCII字符是多字節。這意味着它們將是不止一個'^'的序列 - 通過cat -v輸入。

  • Shell環境(LC_ALL等)是在我的經驗問題的最常見原因。確保您的系統具有包含UTF-8和其他語言的區域設置拉丁1可用。 Always將您的LC_ALL設置爲明確命名編碼的語言環境,例如LC_ALL=sv_SE.iso88591

  • 在bash和zsh中,您可以用該命令的具體環境的變化,運行一個命令,就像這樣:

    $ LC_ALL=sv_SE.utf8 python ./foo.py 
    

    這使得它更容易比不必導出不同的區域進行測試,和你不會污染殼。

  • 不要以爲你內部有Unicode字符串。編寫驗證字符串是否爲unicode的斷言語句。

    assert isinstance(foo, unicode) 
    
  • 學會認識錯位/歪曲你正在使用的編碼普通字符版本。例如。 '\ xe4'是latin-1的縮寫,'ä'是兩個UTF-8字節,它們構成了拉丁語-1中的錯誤表示。我發現知道這種gorp切割調試編碼問題相當大。

0

默認情況下,當python遇到unicde的編碼問題時,它會引發錯誤。但是,可以修改此行爲,例如,如果錯誤是預期的或不重要。

假設您在兩個ASCII碼超集之間進行轉換。兩者大部分是相同的字符,但沒有一對一的對應關係。因此,你會想忽略錯誤。

爲此,請在編碼函數中使用errors變量。

mystring = u'This is a test' 
print mystring.encode('utf-8', 'ignore') 
print mystring.encode('utf-8', 'replace') 
print mystring.encode('utf-8', 'xmlcharrefreplace') 
print mystring.encode('utf-8', 'backslashreplace') 

如果在讀/寫時使用了錯誤的編碼,unicode存在很多問題。確保獲得unicode字符串後,將其轉換爲unicode desired by jinja2的形式。

如果這沒有幫助,可否請您添加第二個錯誤,您可能會看到一個代碼片段來澄清發生了什麼?

0

嘗試使用.encode(encoding)而不是.decode(encoding)在片段中出現的所有情況。