2011-04-25 5 views
3

'\ xe9'와 같은 특수 문자가 포함 된 문자열 (원래 검색 엔진의 검색 결과에서 가져온 문자열)을 가지고 있으며 그 문자를 일반 문자로 바꿔서 인쇄 할 수 있습니다. 파이썬 프로그램).파이썬에서 인쇄 할 수없는 문자열을 일반 문자열로 변환하는 방법은 무엇입니까?

그럼 어떻게해야합니까? UnicodeEncodeError : 'charmap'코덱은 다음과 같은 오류를 작성합니다. "파일"D : \ Python27 \ lib \ encodings \ cp1255.py "12 행의 인코딩 반환 codeecs.charmap_encode (input, errors, encoding_table) 위치 11 인 코드 문자 U '\의 xe9': "나는 인쇄 할 때, 그런데

"sys.getdefaultencoding() 문자가 정의되지 않은 매핑은 "그것은 인쇄 : Cp1255

를 오류 원래이 함수 호출에 발생

: "urllib.urlencode (THE STRING)"하지만 print (firstSearch [ 'Results [] ['Title ']) "라고 쓰려고 할 때도 발생합니다. firstSearch는 검색 결과에서 작성한 JSON입니다. 검색 엔진의 ...

tnx, It 아마르.

+0

음을 쓸 수 있습니까? 모든 바이트를 무작위로 다른 바이트에 매핑 할 수는 있지만 원하는 것은 적절하지 않습니다. – delnan

+0

어떤 플랫폼입니까? 'sys.stdout.encoding'이란 무엇입니까? 질문을 편집하여 전체 추적 및 전체 오류 메시지를 표시하십시오. –

+0

[유니 코드의 변환] 가능한 복제본 (http://stackoverflow.com/questions/5701569/conversion-of-unicode) –

답변

1

당신이 기본 인코딩이 작은 라틴어 히브리어 스크립트, u'\xe9' 좋아하지 서유럽 문자를 지원하는 하이 비트 세트 문자를 사용하는 cp1255 인으로, 히브리어 로케일로, Windows 시스템에있는 것으로 보인다 급성 전자 편지.

당신은 IDLE에서

print u'\xe9' 

을하고 전자 급성가 인쇄되는 관찰 할 수 있어야한다.

참고 : 기본 인코딩이 UTF-something (대개 UTF-8) 또는 GB18030 인 경우 str(some_unicode_string)은 실용적 (즉, 모든 유니 코드 문자 지원)입니다. Windows 컴퓨터의 경우 일반적으로 ascii입니다. 너의 것은 'cp1255'다. 이것은 임의의 유니 코드 문자에는 적합하지 않다. 댓글에서 제공하는 새로운 정보 후

업데이트 : 당신의 urllib.urlencode() 문제에 대한

:이 함수는 str 객체를 기대하고있다. unicode 개체를 제공하고 있습니다. 파이썬 2.x는 시스템 기본 인코딩 (귀하의 경우 cp1255)을 사용하여 인코딩하려고 시도합니다. cp1255u'\xe9'을 처리하지 않으므로 오류 메시지가 표시됩니다. 의사 소통하는 웹 사이트에서 어떤 인코딩이 필요한지 확인해야합니다. 운이 좋으면, 그것은 UTF-8입니다. the_unicode_string을 전달하는 대신 the_unicode_string.encode(website_expected_encoding)을 전달합니다. 예상 인코딩이 cp1255이거나 쿼리에 의해 반환 된 모든 유니 코드 문자를 지원하지 않는 다른 인코딩 (다른 사이트 또는 동일한 사이트에있는 경우)이 있다면 운이 정말 좋지 않은 것입니다. 먼저 unicode 문자열을 얻은 방법을 자세히 검토하십시오. this answer by @bobince ... 좀 덜 유익한 답변을 무시하십시오.

+0

그래, 창문에 있는데 기본 인코딩은 Cp1255입니다. 그러면 문자열을 일반 문자열로 어떻게 변환합니까? 내 의도는 실제로 문자열을 인쇄하는 것이 아니라 문자열을 사용하여 인쇄 할 수 없으면 코드의 다른 줄에서 오류가 발생합니다. 또한이 함수를 호출하면 원래 오류가 발생했습니다 : urllib.urlencode (THE STRING), 그래서이 함수 호출이 통과 할 수 있도록 어떻게 든 STRING을 일반 인코딩 된 문자열로 변환해야합니다. – Itamar

1

codecs 모듈을 사용하면 지정된 문자열을 나중에 사용할 수있는 인코딩 (예 : 인쇄 또는 다른 기능으로 전달)으로 변환 할 수 있습니다. 임의적 인 목적을위한 가장 안전한 인코딩은 물론 ASCII이지만 가장 손실이 많은 인코딩이기도합니다.

예.인코딩에 인에서

s = "\xe9 and other stuff" 
s1 = codecs.encode(codecs.decode(s,'<source-encoding>', 'replace'), 'utf-8') 

는 유니 코드 문자열로 소스 문자열을 디코딩한다 (당신은 검색 엔진 반환을 인코딩하는 확인해야합니다). replace 인수를 사용하면 알 수없는 문자를 '?'로 대체 할 수 있습니다. (정보의 손실)하지만 다른 옵션도 있습니다. 문서를 확인하십시오.

그런 다음 결과는 대상 인코딩 (예 : utf-8)으로 인코딩됩니다. 이 인코딩을 지원하는 터미널에서 문자열을 인쇄하려고합니다. 결과 문자열을 추가로 처리하려면 가능한 한 오랫동안 유니 코드를 사용하는 것이 좋습니다. 여기에서 주목해야 할

두 가지 :

  • 당신은 입력 문자열의 인코딩이 무엇인지 알 필요가있다.
  • 대상 기능에서 처리 할 수있는 인코딩을 알아야합니다. 이것은 'print'(ascii?)와 'urllib.urlencode'(unicode?)에서 다를 수 있습니다.

NB 다음 함수 .encode 및 .decode 기능도 문자열 방법으로 사용할 수 있습니다, 그래서 당신은 어떤 문자는하고 싶지 않습니다 s.decode(...)

+0

-1 (1) codecs.encode 및 codecs.decode에 대해 언급하는 것은 일반적으로 "str.decode 및 unicode.encode에 집착하지 말고"일반적으로 "문자열 방법"을 언급하는 obfuscation (2)을 구성하므로 unicode.decode 및 str.encode unicode'는 인코딩이 아닙니다. (4) urllib.urlencode (그 이름을 더 잘 선택할 수 있었을 것입니다)는'str' 객체를 기대하고 a를 반환합니다. 'str' 객체; 입력을 만드는 데 사용 된 인코딩은 해당 함수와 관련이 없지만 물론 클라이언트와 서버가 알고 있어야합니다. –

+1

@ 존 귀하의 의견을 다소 파괴적이라고 생각합니다. 나는 왜 관련 파이썬 모듈을 언급하는 것이 "난독 화"되어야하는지 (1) 생각할 수 없다. 나는 또한 최선의 방법을 답안에 넣을 수는 없다고 생각하지만 그렇지 않으면 서평을 쓰겠지만 OP가 더 공부하고 마음을 굳힐 것을 기대합니다. 또한 대답에서 100 % 정확할 수는 없으며 파이썬 데이터 유형과 인코딩 (예 : UCS-2) (3)을 모두 언급 할 때 '유니 코드'라는 용어를 사용합니다. 그리고 urllib.urlencode는 분명히 임의의 문자열을 처리 할 수 ​​없으므로 처음부터이 질문을합니다 (4). – ThomasH

+0

(1) 0.0001 %의 사람들이 encode/decode 함수를 사용하기 때문에 난독 화됩니다. 나머지 세계는 str/unicode 메소드를 사용합니다. 코덱 함수를 마지막으로 언급해야합니다. (2) OP가 "더 공부 한"경우, 그들은 여기서 질문을하지 않을 것입니다. (3) "unicode"는 "UCS-2"가 아니며 인코딩이 아닙니다. 그것은 "부정확"하지 않습니다. 잘못된 것입니다. (4) 다시 요점을 놓쳤습니다. urllib.urlencode는 임의의'str' 객체를 처리 할 수 ​​있습니다. 유니 코드 (unicode) 객체를 처리 할 수 ​​있다고 제안 했는가? "str"과 "string"이 섞여 있습니까? –

관련 문제