2013-08-27 1 views
9

Python을 배우는 데 도움이되는 프로젝트로 json 데이터를 사용하여 Reddit의 CMD 뷰어를 만들고 있습니다 (예 : www.reddit.com/all/). .json). 특정 게시물이 나타나고 인쇄하려고하면 (이 오류를 일으키는 것으로 가정합니다)Python에서 JSON 객체의 문자 ' u2019'를 인쇄 할 수 없습니다.

추적 (가장 최근 통화 마지막) : 파일 "C : \ Users \ nsaba \ Desktop \ reddit_viewer.py ", 줄 33, % % (i + 1, obj [ 'data'] [ 'score'], obj [ 'data'] [ '제목']))

파일 : 인코딩 복귀 codecs.charmap_encode (입력 self.errors, encoding_map에서 "C \ Python33 \ LIB \ 인코딩 \ cp437.py", 라인 19) [0] UnicodeEncodeError : 'charmap'코덱은 문자 '\ u2019'를 으로 인코딩 할 수 없습니다. 32 : 문자 매핑은

입니다.

request = urllib.request.urlopen(url) 
content = request.read().decode('utf-8') 
jstuff = json.loads(content) 

내가 위의 오류에 나와있는 데이터를 인쇄하는 데 사용하는 행 :

print ("%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title'])) 

사람이 제안 할 수는 내가 잘못 갈 수있는 내가 데이터를 처리 할 경우 다음

은?

+0

문제는 JSON 또는 코드의 다른 내용과 거의 관계가 없습니다. 'print ('\ u2019')'그냥 시도해보고 같은 오류가 발생하는지 확인하십시오. 그렇다면 문제는 터미널 ("DOS 상자")이 유니 코드 출력을 제대로 수행하도록 설정되어 있지 않아서 해결해야 할 문제입니다. – abarnert

+0

네 말이 맞아. 여분의 데이터를 얻는 이유는 내가 가지고있는 정보가 아니라 내가 생각하는 것에 대한 질문을하는 법을 배웠기 때문입니다. –

+1

그러나 문제를 나타내는 최소한의 완전한 예제를 게시해야합니다. 이것이 바로 [SSCCE] (http://sscce.org)의 전부입니다. 'print ('\ u2019')가 그것을 증명하기에 충분하다면, 더 복잡한 예제는 야생 거위 추격에 사람들을 인도 할 것입니다. 사람들이 "왜 그 캐릭터를 인쇄하고 싶습니까?"라고 물을지도 모른다는 걱정이 든다면, 그것을 설명하는 문맥을 추가 할 수 있습니다. 그러나 여전히 실제 문제로 이어집니다. – abarnert

답변

18

그것은 당신 문제는 당신이 보여준 코드와는 아무 상관이 없으며, 한 줄에서 복제 할 수있는 거의 확실입니다 :

print(u'\2019') 

터미널의 문자 집합 + 2019 U를 (처리 할 수없는 경우 또는 파이썬이 터미널이 사용하는 문자셋에 대해 혼란 스러울 때), 그것을 인쇄 할 방법이 없다. JSON에서 온 것이 든 다른 곳에서 온 것이 든 상관 없습니다.

Windows 터미널 (일명 "DOS 프롬프트"또는 "cmd 창")은 대개 110000 문자 중 약 256 개만을 인식하는 cp1252와 같은 문자 집합으로 구성되며 대폭 변경하지 않고도 Python이 할 수있는 것은 없습니다 *

자세한 내용, 해결 방법 및 자세한 정보 링크는 Python Wiki의 PrintFails을 참조하십시오. SO에서이 문제에 대한 몇백 개의 dups가 있습니다 (많은 것은 Python 2.x에 대해 언급 할 예정 임). 파이썬은 그 표준 출력은 윈도우 터미널입니다 감지 할 수 있도록, 그래서 UTF-16로 인코딩 할 경우 대신 특별한 API를 사용


* 윈도우, 터미널에 UTF-16 인쇄 API를 완전히 별도의 세트를 가지고 인코딩을 터미널의 charset에 적용하고 표준 인코딩을 사용합니다. 그러나 이로 인해 여러 가지 문제가 발생합니다 (예 : 서로 다른 인쇄 방법으로 stdout이 동기화되지 않음). 이 변경 사항에 대한 논의가있었습니다 만, 모든 사람들이 동의하고 패치가 내일 작성 되었더라도 앞으로 추가 될 Python 버전으로 업그레이드 할 때까지는 도움이되지 않습니다 ...

+0

속임수를 유감스럽게 생각합니다. 내가 제공 한 자료를 둘러 볼 것입니다. –

+3

@ N-Saba : 글쎄, 이것이 dup이라는 것을 아는 것은 어렵다. 왜냐하면 만약 당신이 이미 답의 적어도 절반을 알기 전까지 당신이 찾고있는 것이 무엇인지 분명하지 않기 때문이다 ... – abarnert

+0

@ N-Saba, 나는 이것이 오래되었다는 것을 안다. 쓰레드가 아니라 질문에 대답했다면 이것을 대답으로 표시해야합니다. (내 것이 었습니다) – ivan7707

0

나는 IDLE Python Shell) 및 Window의 CMD 기본 글꼴을 Lucida Console (utf-8 지원 글꼴)에 추가하면 이러한 유형의 오류가 사라집니다. 당신은 더 이상 상자는 [] [] [] [] [] [] [] []

이 :)

0

N-사바 @, 오류를 발생시키는 문자열이 무엇을 슬로우됩니다 볼? 제 테스트의 경우, 파이썬 2.7.3의 버전 별 버그 인 것 같습니다.내가 구문 분석 된 피드에

은 "제목"필드는 다음 값이 있었다 : 파이썬에서, 나는이 중 하나를 호출 할 때 내가 예상 우측 작은 따옴표 문자를 얻을

u'title': u'Intel\u2019s Sharp-Eyed Social Scientist' 

2.7.6 . 내가 키 이름으로 당겨 값을 인코딩하지 않는

python -c "print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title']" 
Intel’s Sharp-Eyed Social Scientist 

2.7.3에서, 나는 오류가 발생합니다.

print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'] 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 5: ordinal not in range(128) 
print {u'title': u'Intel\u2019s Sharp-Eyed Social Scientist'}['title'].encode('utf-8', 'replace') 
Intel’s Sharp-Eyed Social Scientist 

fwiw, @abamert 명령 print ('\ u2019')는 "9"를 인쇄합니다. 나는 의도 한 코드가 print (u '\ u2019')라고 생각한다.

+0

기본값은 유니 코드이므로'u'는 파이썬 3에는 필요하지 않습니다. – leewz

+0

2.7.6에서이 오류가 발생합니다. – user1167442

0

Python 2.7.14의 Win 설치에서 API JSON 출력을 pd.DataFrame.to_csv()을 통해 .cav 파일에 쓰려고 시도했을 때 비슷한 오류가 발생했습니다. utf-8로 인코딩을 지정

내 처리 고정 : 맥 OS에이 발생 사람들을위한

pd.DataFrame.to_csv(filename, encoding='utf-8') 
0

는, @의 abarnert의 대답이 올바른지를 내가 잘못된 소스 파일의 상단에이를 넣어 문제를 해결할 수 있었다 : -

# magic to make everything work in Unicode 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

명확하게 말하면, 이것은 터미널 출력이 유니 코드를 올바르게 받아 들일 수 있도록합니다.

관련 문제