2012-07-12 85 views
1

有沒有人有這方面的經驗?python sl4a unicode(Android)

我在過去的半年裏一直在使用python 3.2,而我對2.6.2的記憶並不是那麼好。

import contextlib 
import codecs 

def readfile(path): 
    with contextlib.closing(codecs.open(path, 'r', 'utf-8')) as f: 
     for line in f: 
      yield line 

path = '/path/to/norsk/verbs.txt' 

for i in readfile(path): 
    print i 

,但在手機上它到達第一個特殊字符ø並拋出:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 3: ordinal not in range(128)

任何

在我的電腦下面的代碼工作,使用2.6.1測試因爲我需要輸入它們以及從文件中讀取文件?

+0

「但在電話上」? – 2012-07-12 16:11:58

+0

sl4a是Android設備的腳本層。 – beoliver 2012-07-12 16:16:16

回答

2

打印是一種I/O操作。 I/O需要字節。你在i中有什麼是unicode或字符。當我們談論ascii時,字符只能直接轉換爲字節,但在手機上遇到非ascii字符(u'\xf8' is ø)。要將字符轉換爲字節,您需要對它們進行編碼。

import contextlib 
import codecs 

def readfile(path): 
    with contextlib.closing(codecs.open(path, 'r', 'utf-8')) as f: 
     for line in f: 
      yield line 

path = '/path/to/norsk/verbs.txt' 

for i in readfile(path): 
    print i.encode('utf8') 

至於爲什麼這個工程在你的代碼的工作一臺機器,而不是其他的,我敢打賭,python的自動檢測發現不同的東西在這些情況下。在每個設備上運行此操作:

$ python 
>>> import sys 
>>> sys.getfilesystemencoding() 
'UTF-8' 

我希望你會看到utf8在另一個上,而在另一個上看到ascii。這是打印機在目的地是終端時使用的內容。如果你確定你的python安裝的所有用戶(很可能只是你)比ascii更喜歡utf8,你可以改變你的python安裝的默認編碼。

  1. 找到你site.py:python -c 'import site; print site
  2. 打開它,找到setencoding功能:

    def setencoding(): 
        """Set the string encoding used by the Unicode implementation. The 
        default is 'ascii', but if you're willing to experiment, you can 
        change this.""" 
        encoding = "ascii" # Default value set by _PyUnicode_Init() 
    
  3. 更改encoding = "ascii"encoding = "UTF-8"

享受的事情就這樣工作。你可以在這裏找到關於這個主題的更多信息:http://blog.ianbicking.org/illusive-setdefaultencoding.html

如果你想反而像python3提供的字符與字符嚴格分離,你可以設置encoding = "undefined"undefined編解碼器將「Raise an exception for all conversions. Can be used as the system encoding if no automatic coercion between byte and Unicode strings is desired.

+0

太棒了。然後我在輸入時使用解碼? – beoliver 2012-07-12 16:19:28

+0

+1爲跟進。非常感激。 – beoliver 2012-07-12 18:08:02

+0

您的codecs.open已經爲您解碼。如果你使用簡單的'open()',你會得到字節,並且不用擔心這個東西,但是如果你打算做任何類型的處理(例如將內容與另一個文件進行比較)你會想要獲得角色,就像你使用'codecs.open'一樣。 – bukzor 2012-07-13 15:20:32

0

打印功能需要將字符串轉換爲可打印格式,因爲unicode字符串不能自動打印。使用repr print repr(i)包裝將允許您打印,但您可能需要指定編碼。