2014-07-17 1 views
4

Windows에서 제대로 작동하지만 Android에서 파일을 열지 못하는 kivy에서 실행되는 프로그램이 있습니다 (두 플랫폼 모두에서 1.8.0). 이상한 점은 utf-8을 명백히 요구할 때 ASCII를 해독하려는 오류 메시지가 있음을 나타내는 것입니다. 또한 파일에는 0xFF 문자가 포함되어 있지 않습니다. od 유틸리티를 사용하여 확인했습니다.안드로이드에서 kivy/Python의 유니 코드 코덱이 누락 되었습니까?

코드 :

try: 
    Logger.info('Mark: opening file ' + repr(filename)) 
    with codecs.open(filename, 'r', encoding='utf_8') as f: 
     lines = [line.rstrip(u'\r\n').lstrip(codecs.BOM) for line in f] 
except UnicodeDecodeError as e: 
    Logger.info('Mark: utf8 load failed: ' + str(e)) 
    with codecs.open(filename, 'r', encoding='cp1252') as f: 
     lines = [line.rstrip(u'\r\n') for line in f] 

로그 파일 :

[INFO    ] Mark: opening file '/mnt/sdcard/My Files/Documents/DVDs.txt' 
[INFO    ] Mark: utf8 load failed: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 
[INFO    ] Base: Leaving application in progress... 
[WARNING   ] stderr: Traceback (most recent call last): 
[WARNING   ] stderr: File "main.py", line 295, in <module> 
[WARNING   ] stderr:  app.run() 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/app.py", line 792, in run 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/base.py", line 481, in runTouchApp 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/core/window/window_pygame.py", line 381, in mainloop 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/core/window/window_pygame.py", line 287, in _mainloop 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/base.py", line 321, in idle 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/clock.py", line 422, in tick 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/clock.py", line 537, in _process_events 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/site-packages/kivy/clock.py", line 309, in tick 
[WARNING   ] stderr: File "main.py", line 266, in select_file_part2 
[WARNING   ] stderr:  with codecs.open(filename, 'r', encoding='cp1252') as f: 
[WARNING   ] stderr: File "/home/tito/code/python-for-android/build/python-install/lib/python2.7/codecs.py", line 884, in open 
[WARNING   ] stderr: LookupError: unknown encoding: cp1252 

편집 : 나는 entire list 통해 갈 디버깅 코드에 넣고 모든 ascii 제외 없어진 것을 발견, latin_1 , 다양한 utf 코덱.

+0

FYI 자동 BOM 운반 사용'UTF-8에 대한 sig'. –

+0

@ MarkTolonen 왜 디코딩 오류가 발생했는지 알아 냈습니다. 고마워요. 그러나 그것은 여전히'cp1252'가 빠진 이유를 설명하지 못합니다. 나는 두 가지 다른 오류가 있었던 것 같아요. –

+0

인코딩이 Android에서 제공되지 않을 수 있습니다. 파이썬의'Lib \ encodings \ cp1252.py' 파일은 존재합니까? –

답변

3

try/except를 제거하고 실제 예외를 살펴보십시오. codecs.BOM는 바이트 스트링 \xff\xfe이며 기본 ascii 코덱을 사용하는 유니 강요되고 :

>>> import codecs 
>>> codecs.BOM 
'\xff\xfe' 
>>> u'test'.lstrip(codecs.BOM) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128) 
관련 문제