UTF-8

2015-01-19 5 views
0

다음과 같이 내가 파일을 읽고 있습니다로 읽기에도 불구하고 유니 코드 문자를 인쇄 할 수 없습니다 :UTF-8

def main(src): 
    with open(src, encoding='UTF-8') as incoming: 
     for line in incoming: 
      data = line 
      print(data) 
     del line 

코드 (이 브라우저에 표시됩니다 경우 나도 몰라)이 줄을 쳤다됩니다 :

를는 부족
<DT><A HREF="https://www.youtube.com/watch?v=-ygKS7WU4YU" ADD_DATE="1421587655">?*** EarAbuse ♛ &#39;Pppppp&#39; (Official &amp; Uncensored) - YouTube</A> 

공지 사항 B 것을 C 헤스 Q ueen (예 : \ u265b) 단지 reporte 등의 문제를 일으키는 것으로 보인다 EarAbuse 단어 후 파일 여는 동안 D

Traceback (most recent call last): 
    File "a.py", line 18, in <module> 
    moduleName.main(fileName) 
    File "C:\Users\Systems\Desktop\merc\bm\chrome.py", line 53, in main 
    print(data) 
    File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u265b' in position 
87: character maps to <undefined> 

제가

안좋다 IN-
  1. 가 docs.python.org/3/howto/unicode.html 판독
  2. data = repr(line) 사용
  3. errors="surrogateescape" 사용

    사랑이 없습니다. 또한 charbase는 그 BCQ에 대한 python 이스케이프가 u'\u265b'이라고 말합니다. &은 아직 구현하지 않았습니까?

    편집 : 이상하게도, IDLE에서 print('\u265b') 또는 print(♛)를 입력하면 오류 &없이 잘 작동이 아름다운이 BCQ 것을 보여준다 - 그래서 어떤 문제가 있는지, 왜 내 코드가이 선을 넘어 읽지 않습니다?

+0

파일에 문제가 없습니다.'print()'하려고하는 터미널에 문제가 있습니다. 터미널이'charmap' 코덱을 사용하고 있습니다. 아마도 당신이 Windows에 있기 때문입니다. – Kevin

답변

0

BCQ 문자를 인쇄하려고 할 때 문제가 발생합니다. 나는 당신의 콘솔 인코딩/로케일이 모든 유니 코드 코드 포인트를 방출 할 수 없다는 것을 추측 할 것입니다 - 즉 그것은 ASCII 또는 256 문자 코드 페이지입니다.

대신 인쇄

, 시도 :

오류가
import sys 

sys.stdout.buffer.write(data.encode('utf8')) 
+0

물론 이것은 아마도 실제로 UTF-8을 사용하지 않는 터미널에서 [mojibake] (http://en.wikipedia.org/wiki/Mojibake)를 제공 할 것입니다 ... – Kevin

+0

True - 그냥 OP를 가리키려고합니다. 사람이 어떤 환경에서 일하고 있는지 정확히 알지 못해 올바른 방향으로. – ErikR

+0

감사합니다. @ user5402, 지원 또는 지원이 필요하지 않습니다. 내 코드가 터미널에 표시 할 항목이 필요합니다. 또한이 질문에 대한 더 나은 제목을 제안하여 나중에 다른 사용자에게 도움이 될 수 있도록하십시오. – aim100k

3

(거의) 자기 explainatory을. 그것은 파이썬이 '\u265b'을 나타낼 수없는 Windows 1252 문자 세트의 문자열을 인코딩하려고 시도한다고 말합니다. GUI 응용 프로그램은 글꼴이 표현할 수있는 글립 문자로만 제한되며, 콘솔 응용 프로그램은 콘솔의 코드 페이지의 256 문자 만 표시하므로 유휴 상태에서도 정상적으로 작동합니다.

당신은 명시 적으로 errors='replace'으로, 올바른 코드 페이지에서 바이트 배열로 문자열을 변환해야

: 콘솔 드라이버가 UTF 문자를 표시 할 수 물론

for line in incoming: 
    data = line 
    print(data.encode('cp1252', errors='replace')) 

가 대신 ?를 표시합니다 하지만 오류는 발생하지 않습니다.

당신은 b'...', 당신은 문자를 8 개 비트를 인쇄하고 있는지 말을 바로 다시 문자열로 다시 변환 마음에 들지 않으면 :

print(data.encode('cp1252', errors='replace').decode('cp1252')) 

전진 - 후진 인코딩 그냥 모든 문자가 이제 콘솔에 인쇄 가능한되도록 (또는 대체됩니다).

+0

큰 통찰력을 주셔서 감사합니다, +1 (에드), 나는 분명히 당신의 대답에서 배울 것이지만 그것을 완전히 소화 할 수있는 약간의 시간이 필요할 것입니다. 또한, 어떻게 그것이 'Windows 1252'였는지 알아 냈습니까? – aim100k

+0

@ user4453945 : 오류 메시지'File "... \ cp1252.py"'나는 파이썬이 win1252에서 인코딩하려고한다고 가정했습니다. 그러나 나는 정말로 확신 할 수 없다. 그러나 콘솔의'chcp'는 현재 코드 페이지를 보여줍니다. –

+0

좋습니다. 한 가지 더 - 좋은 "오류 읽기"의 우수성을 개발하는 방법, 작은 답변을 게시하는 데 시간을 할애 할 수 있다면? – aim100k