2014-06-24 7 views
1

텍스트를 바꾸려고합니다. 아쉽게도 기본 문자열은 유니 코드 형식으로 저장되지만 바꿀 텍스트를 설명하는 문자열은 형식 문자열로 저장됩니다. 다음은 재현 예는 다음과 같습니다UnicodeDecodeError : 형식 문자열을 유니 코드로 변환

mystring = u'Bunch of text with non-standard character in the name Rubén' 
old = 'Rubén' 
new = u'newtext' 
mystring.replace(old, new) 

이 오류가 발생합니다 : 나는 unicode(old)와 유니 코드로 old을 변환 할 때

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)

나는 같은 오류가 발생합니다. 몇 가지 해답은 특정 문자에 대한 문제를 해결하지만 일반적인 솔루션을 찾을 수 없습니다.

답변

1

코덱을 사용하여 old 값을 유니 코드로 변환해야합니다. 그 코덱은 당신이 old을 어떻게 소싱했는지에 전적으로 달려 있습니다.

소스 코드에서 문자열 리터럴 인 경우 소스 코드 인코딩을 사용하십시오. Python은 주석의 맨 위에 유효한 코덱을 지정하지 않으면 소스 파일을 허용하지 않습니다. PEP 263

단말에 old 정의를 붙여 넣는 것은 터미널 코덱을 사용합니다 (터미널은 붙여 넣기 할 때 파이썬 인코딩 된 바이트를 보냅니다).

데이터가 다른 곳에서 제공된 경우 해당 소스의 인코딩을 결정해야합니다. HTTP 데이터의 경우 charset 매개 변수에 대해 Content-Type 헤더를 확인하십시오.

그런 다음 디코딩 :

old = old.decode(encoding) 

당신이 명시 적으로 코덱없이 unicode(old)를 사용하거나 unicode.replace()에 bytestring을 사용하려고, 파이썬은 ASCII, 기본 코덱을 사용합니다. UTF-8을 사용하도록 구성 내 터미널에서

데모 :

>>> import sys 
>>> sys.stdin.encoding # reflects the detected terminal codec 
'UTF-8' 
>>> old = 'Rubén' 
>>> old # shows encoded data in python string literal form 
'Rub\xc3\xa9n' 
>>> old.decode('utf8') # unicode string literal form 
u'Rub\xe9n' 
>>> print old.decode('utf8') # string value written to the terminal 
Rubén 
>>> mystring = u'Bunch of text with non-standard character in the name Rubén' 
>>> new = u'newtext' 
>>> mystring.replace(old, new) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128) 
>>> mystring.replace(old.decode('utf8'), new) 
u'Bunch of text with non-standard character in the name newtext' 

는 일반적으로, 당신은 초기 디코드, 후반 인코딩 원하는; 데이터 흐름을 유니 코드 샌드위치로 만듭니다. 텍스트를 수신하자마자 유니 코드 값으로 모두 디코딩하고 데이터가 프로그램에서 나올 때까지 다시 인코딩하지 마십시오.

+0

감사! 다른 질문에 대한 답에서 누락 된 핵심 정보는 코덱이'sys.stdin.encoding'인지 파악하는 것입니다. 불행히도 일반 텍스트는 일반 텍스트가 아니라 (내 경우에는) cp1252입니다. – Michael

+0

@Michael : 사람들은 ASCII 사용에만 익숙합니다. 정말로 평범한 텍스트입니다. –

관련 문제