unicode_escape
일반적으로 작동하지 않습니다
그것은 밝혀 그 string_escape
또는unicode_escape
특히, 실제 유니 코드의 존재에 일을하지 않습니다 - 솔루션은 일반적으로 작동하지 않습니다.
모든 비 ASCII 문자가 이스케이프 된다는 것을 확신 할 수 있다면 (그리고 처음 128자를 초과하는 것은 비 ASCII unicode_escape
라는 점을 기억하십시오) 올바른 일을 할 것입니다. 그러나 문자열에 이미 ASCII가 아닌 문자가 있으면 문제가 발생합니다.
unicode_escape
기본적으로 바이트를 유니 코드 텍스트로 변환하도록 설계되었습니다. 그러나 많은 곳에서 (예 : Python 소스 코드) 소스 데이터는 이미 유니 코드 텍스트입니다.
이것이 올바르게 작동 할 수있는 유일한 방법은 먼저 텍스트를 바이트로 인코딩하는 것입니다. UTF-8은 모든 텍스트에 적합한 인코딩이므로 작동해야합니다.
다음 예제는 Python 3에 있으므로 문자열 리터럴이 더 깨끗하지만 Python 2와 3 모두에서 약간 다른 표현으로 동일한 문제가 존재합니다.
>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve test
글쎄, 그건 틀렸어.
텍스트를 텍스트로 디코딩하는 코덱을 사용하는 새로운 권장 방법은 codecs.decode
직접 호출 하는 것입니다. 도움이 되나요?
>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve test
전혀. (또한 위는 Python 2의 UnicodeError입니다.)
unicode_escape
코덱은, 그 이름에도 불구하고, 모든 비 ASCII 바이트 라틴-1 (ISO-8859-1) 인코딩에 있다고 가정하는 것이 밝혀졌습니다. 따라서 다음과 같이해야합니다.
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve test
그러나 그것은 끔찍합니다. 이것은 마치 유니 코드가 전혀 발명되지 않은 것처럼 256 개의 Latin-1 문자로 제한됩니다!
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
문제를 해결하기 위해 정규식 추가
(놀랍게도 두 가지 문제가 없습니다.)
우리가해야 할 일은 unicode_escape
우리가 ASCII 텍스트라고 확신하는 것들 에만 디코더를 적용하는 것입니다. 특히 ASCII 텍스트로 보장되는 유효한 Python 이스케이프 시퀀스에만 적용 할 수 있습니다.
계획은 정규 표현식을 사용하여 이스케이프 시퀀스를 찾고, re.sub
이스케이프되지 않은 값으로 대체 하기 위해 함수를 인수로 사용하는 것입니다.
import re
import codecs
ESCAPE_SEQUENCE_RE = re.compile(r'''
( \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
)''', re.UNICODE | re.VERBOSE)
def decode_escapes(s):
def decode_match(match):
return codecs.decode(match.group(0), 'unicode-escape')
return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
그리고 그것으로 :
>>> print(decode_escapes('Ernő \\t Rubik'))
Ernő Rubik
'spam'+"eggs"+'''some'''+"""more"""
이 처리 될 것으로 정확히 어떻게 예상 합니까?