2016-07-01 7 views
14

이것은 Converting to Emoji의 후속 조치입니다. 그 질문에서, OP는 json.dumps() 인코딩 된 파일과 대리모 쌍으로 표현 된 이모티콘을 가지고 있습니다 - \ud83d\ude4f. S/he가 파일을 읽고 이모티콘을 올바르게 번역하는 데 문제가 있었으며 올바른 answer은 파일의 각 줄에 json.loads()이었고 json 모듈은 서로 게이트 쌍을 다시 (UTF8로 인코딩 된 것으로 가정합니다) 변환을 처리합니다. 그림 이모티콘. 그래서 여기Python에서 서로 게이트 쌍을 사용하는 방법은 무엇입니까?

내 상황 : 그것에서 emoji의 표현을 얻을 수

emoji = "This is \ud83d\ude4f, an emoji." 

가 어떻게이 문자열을 처리 할 : 나는 그것에 대리 쌍 단지 일반 파이썬 3 유니 코드 문자열이 있다고 ? 나는 이런 식으로 뭔가를 얻을 찾고 있어요 : 나는 시도했다

"This is , an emoji." 
# or 
"This is \U0001f64f, an emoji." 

:

print(emoji) 
print(emoji.encode("utf-8")) # also tried "ascii", "utf-16", and "utf-16-le" 
json.loads(emoji) # and `.encode()` with various codecs 

일반적으로 나는 UnicodeEncodeError: XXX codec can't encode character '\ud83d' in position 8: surrogates no allowed과 유사한 오류가 발생합니다.

나는 리눅스에서 파이썬 3.5.1을 실행 중이고 은 en_US.UTF-8으로 설정되어 있습니다. 이 샘플은 명령 행의 Python 인터프리터와 Sublime Text에서 실행되는 IPython에서 모두 실행되었습니다. 차이점이없는 것으로 보입니다. 및 메모리 (파이썬 소스 코드에서 문자열 리터럴을 사용하여 지정)을 단일 문자 u'\ud83d' :

답변

21

당신은 디스크에 JSON 파일 (\ u d 8 3 d 6 자) 리터럴 문자열 \ud83d을 혼합했습니다. 당신이 다음 버그 상류가 '\ud83d\ude4f' 파이썬 문자열 (2 문자)를 참조하면 파이썬 3

len(r'\ud83d') == 6len('\ud83d') == 1 사이의 차이입니다. 일반적으로 그러한 문자열을 가져서는 안됩니다. 당신이 하나를 얻고 그것을 생성하는 업스트림을 고칠 수 없다면; 당신은 surrogatepass 오류 처리기를 사용하여 문제를 해결할 수 :

>>> "\ud83d\ude4f".encode('utf-16', 'surrogatepass').decode('utf-16') 
'' 

Python 2 was more permissive합니다.

참고 : json 파일에 리터럴 \ ud83d \ ude4f (자)가 포함되어 있어도; 당신은 서로 게이트 쌍을 얻을해야합니다

>>> print(ascii(json.loads(r'"\ud83d\ude4f"'))) 
'\U0001f64f' 

공지 사항 : 결과는 1 문자 ('\U0001f64f')이 아닌 서로 게이트 쌍 ('\ud83d\ude4f')입니다.

+0

굉장합니다, 감사합니다! 나는'surrogatepass' 에러 핸들러를 놓치고있었습니다. – MattDMo