백 슬래시 탈출 아스키 제어 문자를 유니 코드 데이터의 중간에 확실히 달성하려고하는 유용한 일이다. 그러나 실제 문자 데이터를 되돌리려면 문자를 이스케이프 처리하는 것이 아니라 문자를 이스케이프 처리해야합니다.
파이썬 stdlib에서이를 수행하는 방법이 있어야하지만 그렇지 않습니다.
하지만 그 동안의 http://bugs.python.org/issue18679가 여기 번역 및 해커 사용하여 주변의 일이다 : 나는 버그 리포트 제출
tm = dict((k, repr(chr(k))[1:-1]) for k in range(32))
tm[0] = r'\0'
tm[7] = r'\a'
tm[8] = r'\b'
tm[11] = r'\v'
tm[12] = r'\f'
tm[ord('\\')] = '\\\\'
b = u"Пример\n"
c = b.translate(tm)
print(c) ## results in: Пример\n
모든 비 백 슬래시 - 단일 문자 제어 문자가로 이스케이프됩니다 \ x ## 시퀀스를 사용하지만, 다른 작업이 필요하다면 번역 매트릭스를 사용하면됩니다. 이 접근법은 손실이 없으므로 저에게 효과적입니다.
번역을 사용하여 문자 시퀀스를 다시 단일 문자로 변환 할 수 없으므로이 코드를 다시 가져 오는 것은 엉뚱한 것입니다.
d = c.encode('latin1', 'backslashreplace').decode('unicode_escape')
print(d) ## result in Пример with trailing newline character
당신은 실제로 백 슬래시가 unicode_escape 코덱이 모든 것을 올바른 방법으로 재 조립 처리 할 수 있도록 알지 못하는 latin1에 유니 코드 문자를 탈출하면서 개별적으로 라틴를 사용하여 바이트로 매핑 문자를 인코딩해야합니다.
UPDATE는 :
그래서 내가 python2.7과 python3.3 모두에서 작업이 필요한 경우가 있었다. 다음은 내가 한 일입니다 (_compat.py 모듈에 있음) :
if isinstance(b"", str):
byte_types = (str, bytes, bytearray)
text_types = (unicode,)
def uton(x): return x.encode('utf-8', 'surrogateescape')
def ntob(x): return x
def ntou(x): return x.decode('utf-8', 'surrogateescape')
def bton(x): return x
else:
byte_types = (bytes, bytearray)
text_types = (str,)
def uton(x): return x
def ntob(x): return x.encode('utf-8', 'surrogateescape')
def ntou(x): return x
def bton(x): return x.decode('utf-8', 'surrogateescape')
escape_tm = dict((k, ntou(repr(chr(k))[1:-1])) for k in range(32))
escape_tm[0] = u'\0'
escape_tm[7] = u'\a'
escape_tm[8] = u'\b'
escape_tm[11] = u'\v'
escape_tm[12] = u'\f'
escape_tm[ord('\\')] = u'\\\\'
def escape_control(s):
if isinstance(s, text_types):
return s.translate(escape_tm)
else:
return s.decode('utf-8', 'surrogateescape').translate(escape_tm).encode('utf-8', 'surrogateescape')
def unescape_control(s):
if isinstance(s, text_types):
return s.encode('latin1', 'backslashreplace').decode('unicode_escape')
else:
return s.decode('utf-8', 'surrogateescape').encode('latin1', 'backslashreplace').decode('unicode_escape').encode('utf-8', 'surrogateescape')
인코딩 할 문자는 무엇입니까? 그냥'\ r \ n \ t'? "이스케이프 문자"와 같은 것은 없습니다. – agf
문제는 귀하의 요청이 역설적이라는 것입니다. Python 2 문자열 (Python 3'bytes')에는 유니 코드 문자가 포함되어 있지 않습니다. 바이트 만 포함합니다. 이 바이트는 특정 인코딩에 저장된 유니 코드 코드 포인트 일 수 있지만 여전히 바이트입니다. 유니 코드를 저장하려면 '유니 코드'를 사용하십시오. 바이트를 원한다면 바이트를 사용하십시오. 그런데 유니 코드가 없으면 UTF- *라는 정보가없는 바이트 만 있습니다. 이상한 8 비트 코드 페이지 일 수도 있습니다. 또한 통찰력과 일반적인 접근법을 제공하는 http://nedbatchelder.com/text/unipain.html을 참조하십시오. – delnan
@agf 기본적으로 모든 "특수"문자입니다. 필자는 적어도 파이썬이 유니 코드 코드 포인트가 하나의 문자임을 알고 그 코드를 그대로 두길 바란다. –