2012-07-21 3 views
5

나는 너무 오랫동안 인코딩에 어려움을 겪었으며, 오늘 정신 블록을 완전히 열어 놓고 싶습니다.Python을 사용하여 인코딩을 처리하는 방법 요청 라이브러리

바로 지금, 나는 웹 사이트를 긁어 모으기 위해 Requests을 사용하고 있습니다. 페이지 헤더를 사용할 때 chardet으로 떨어지는 인코딩을 알아 내기 위해 HTTP 헤더를 사용하고 있다고 말할 수 있습니다. 를 찾을 수 없다. 거기에서 다운로드 한 바이트 코드를 디코드 한 다음 r.text의 유니 코드 개체를 유용하게 전달합니다.

모두 좋다.

print foo.encode('utf-8') 

문제는 내가 할 때이다 :

그러나 어디 혼란 스러워요 것은 그때 텍스트에 몇 가지 작업을하고 거기에서 나는 인쇄 할 때 인코딩을 제공, 표준 출력에 출력이다 인쇄 된 것은 엉망이됩니다. 다음에, 나는 단어 '판단'과 '표준'사이의 emdash을 얻을 것으로 예상 :

Declaratory judgmentsStandard of review. 

는 대신, 내가 그 안에 네 개의 작은 숫자 모난 것을 얻을. 물론, 여기에 표시하지 않는 것,하지만 난 내가 할 경우 내가 무엇을 얻을에 해당하는 숫자가 0,097 생각 :

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

그래서 가지 말이 있지만, 어디 내 emdash이야?

과정은 아래로 비등 :

  1. 요청 페이지를 다운로드하고 지능적으로 내가 UTF-8 및 인쇄에 인코딩
  2. 내가 그것을 작동 유니 코드 객체에 텍스트를 디코딩 그것.

어디에 문제가 있습니까? 이것은 나에게 mythical unicode sandwich처럼 들리지만 분명히 나는 ​​뭔가를 놓치고 있습니다.

답변

4

이상한 행동을하고 있습니다. \x97cp1252 인코딩의 emdash입니다. 유니 코드 문자열의 경우 U+0097 END OF GUARDED AREA입니다. 어떻게 든 유니 코드로 cp1252 바이트를 읽습니다. 이 상태에 빠지게하는 코드를 더 많이 표시하면 더 깊이 파고들 수 있습니다.

추 신 : 유니 코드 샌드위치는 거의 신화 적이 지 않으며, 그것을 위해 노력하는 것이 이상적입니다! :)

+0

Yup! 니가 끝냈어. [페이지] (http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669)가 문제입니다. Chardet이 'ISO-8859-1'로 인식하도록 인코딩을 선언하지 않으며 Requests는이를 인코딩합니다. 그런 다음 utf-8로 인코딩 할 때 물론 실패합니다. 머리 꼭대기에서 이것을 어떻게 알았습니까? 나는 이것을 피하고 싶다. – mlissner

+0

아, 그리고 또 다른 질문 ... 파이어 폭스와 크롬은이 페이지를 iso-8859-1로도 탐지합니다 ... 그러나 그들은 완전히 에덤을 표시합니다! 그들의 트릭은 무엇입니까? – mlissner

+0

오랜 경험을 통해 \ x9X로 인코딩 된 emdash와 같은 문자는 아마도 cp1252 일 것입니다. Wikipedia에서 cp1252가 당신이 보여준 바이트를 당신이 예상 한 캐릭터와 맵핑한다는 것을 확인했다. cp1252는 실제로 iso8859-1의 상위 집합이며 iso8859-1에는 인쇄 가능한 문자가 들어 있습니다. 그래서 브라우저가 8859-1을 사용할 때 실제로 cp1252를 사용하는 이유는 더 많은 문자를 인쇄 할 수 있기 때문입니다. –