코덱을 사용하여 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'
는 일반적으로, 당신은 초기 디코드, 후반 인코딩 원하는; 데이터 흐름을 유니 코드 샌드위치로 만듭니다. 텍스트를 수신하자마자 유니 코드 값으로 모두 디코딩하고 데이터가 프로그램에서 나올 때까지 다시 인코딩하지 마십시오.
감사! 다른 질문에 대한 답에서 누락 된 핵심 정보는 코덱이'sys.stdin.encoding'인지 파악하는 것입니다. 불행히도 일반 텍스트는 일반 텍스트가 아니라 (내 경우에는) cp1252입니다. – Michael
@Michael : 사람들은 ASCII 사용에만 익숙합니다. 정말로 평범한 텍스트입니다. –