2012-06-24 17 views
2

pymysql을 사용하여 mysql 데이터베이스에 연결하고 요청을 실행 한 후 \xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0 문자열이 있습니다.파이썬에서 유니 코드로 작업하기

이것은 utf8에서는 5 자 여야하지만, print s.encode('utf-8') 일 때 나는 ╨╝╨░╤А╨║╨░이됩니다. 문자열은 파이썬이 인식하지 못하는 유니 코드 문자의 바이트 표현처럼 보입니다.

그래서 파이썬을 올바르게 처리하려면 어떻게해야합니까?

답변

5

decode (아니 encode) 바이트 문자열에서 유니 코드 문자열을 얻으려면.

>>> s = '\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0' 
>>> us = s.decode('utf-8') 
>>> print us 
марка 

ASCII 외부의 문자가 포함되어 있기 때문에 print 수 없으므로 유의하십시오. 그러나 유니 코드 인식 디버거에서 그 값을 볼 수 있어야합니다. 위의 것을 IDLE에서 실행했습니다.

업데이트

당신이 실제로있는 것은이 보인다 :

>>> s = u'\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0' 

이것은 당신이 먼저 decode를 호출하기 전에 bytestring에 그 바이트를 얻을 수 있기 때문에 까다 롭습니다. 나는 그것을 할 수있는 "최고"방법이 무엇인지 모르겠지만,이 작품 : 당신은 문자열로 데이터베이스에 저장 전에 물론 그것을 디코딩해야

>>> us = ''.join(chr(ord(c)) for c in s).decode('utf-8') 
>>> print us 
марка 

참고.

+0

감사합니다. 디코딩을 시도했을 때 "UnicodeEncodeError : 'ascii'코덱은 0-9의 문자를 인코딩 할 수 없습니다 : 서수는 범위가 아닙니다 (128). 문자열이 'u \ xd0 \ xbc \ xd0 \ xb0 \ xd1 \ x80 \ xd0 \ xba \ xd0 \ xb0'으로 표시 되었기 때문에 가능합니다. –

+0

'print s.encode ('latin1 '). decode ('utf8 ')' 나를 위해 일했다. –

4

마크가 맞습니다. 문자열을 디코딩해야합니다. 바이트 문자열은 디코드하여 유니 코드 문자열이되고 인코딩은 다른 방법으로 진행됩니다. 이 내용과 기타 많은 내용은 Pragmatic Unicode, or, How Do I Stop The Pain?입니다.

+0

나는 과거에이 문제에 빠졌습니다. 단지 바이트를 "디코드"하지만 텍스트를 "인코딩"한다는 것을 기억하십시오. –

관련 문제