ASCII 문자열을 유니 코드로 어떻게 처리하고 파이썬에서 탈출 한 문자를 탈출하지 않습니까?
문제
예를 들어, 내가있는 경우 유니 코드 문자열, 나는 그것을 인코딩 할 수 있습니다 ASCII So :
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'
그러나 나는 이것을 가지고있다 ASCII 끈:
'\u003foo\u003e'
... 나는 똑같이 바꾸고 싶다 ASCII 위의 첫 번째 예에서와 같이 문자열 :
'<foo/>'
해결책
이것을 알아내는 데 시간이 걸렸지 만 이 페이지 최고의 답변이있었습니다 :
>>> s = '\u003cfoo/\u003e'
>>> s.decode( 'unicode-escape' )
u'<foo/>'
>>> s.decode( 'unicode-escape' ).encode( 'ascii' )
'<foo/>'
유니 코드 문자열을 지정하는 다른 방법을 처리하는 '원시-유니 코드-에스케이프'코덱도 있습니다. 링크 된 페이지의 "유니 코드 생성자"섹션을 확인하십시오.
편집 : 참조하십시오 파이썬 표준 인코딩.
다른 팁
Ned Batchelder 말했다:
문자열이 어디에서 왔는지에 따라 약간 위험하지만 다음과 같습니다.
>>> s = '\u003cfoo\u003e' >>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') '<foo>'
실제로이 방법은 다음처럼 안전하게 만들 수 있습니다.
>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]
3 인용 바로 직전에 트리플 쿼트 문자열과 대시를 염두에 두십시오.
- 3 인용 문자열을 사용하면 사용자가 문자열에 ' "'(시각적 선명도를 위해 추가)를 입력하면 평가자를 방해하지 않도록합니다.
- 끝의 대시는 사용자의 문자열이 ' "'로 끝나는 경우에 안전한 안전입니다. 결과를 할당하기 전에 삽입 된 대시를 [: -1
따라서 원시 형식으로 캡처되는 한 사용자가 입력 한 내용에 대해 걱정할 필요가 없습니다.
Python 2.5에서 올바른 인코딩은 "Unicode-Escape"가 아닌 "unicode_escape"입니다 (밑줄 참고).
최신 버전의 Python이 유니 코드 이름을 변경했는지 확실하지 않지만 여기에서는 밑줄과 함께 작동했습니다.
어쨌든,이게 다야.
어느 시점에서 당신은 문자열에서 한자 나 이모티콘과 같은 특수 문자를 만나면 다음과 같이 보이는 오류를 해독하려는 문제가 발생합니다.
UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)
내 사례 (트위터 데이터 처리)의 경우 오류없이 모든 문자를 볼 수 있도록 다음과 같이 디코딩했습니다.
>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>
문자열이 어디에서 왔는지에 따라 약간 위험하지만 다음과 같습니다.
>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'