2017-01-19 1 views
0

잘못된 형식의 데이터베이스 데이터베이스가 있습니다. 데이터는 다음과 같습니다두 배로 이스케이프 처리 된 유니 코드 문자열 처리

"street"=>"\"\\u4e2d\\u534e\\u8def\"" 

은 다음과 같이해야 할 때 :

"street"=>"中华路" 

내가 가진 문제는 이중 이스케이프 문자열이 데이터베이스에서 올 때 그들이 중국어로 디코딩되지 않는 것입니다 문자가 있어야합니다. 그래서이 변수가 있다고 가정하십시오. street="\"\\u4e2d\\u534e\\u8def\"" 내가 print(street) 결과는 코드 포인트 "\u4e2d\u534e\u8def"

의 문자열이라고 인쇄하는 경우 내가 실제 유니 코드 문자를 "\u4e2d\u534e\u8def"를 변환하는이 시점에서 할 수 있습니까?

+0

그들이 어떻게되었는지 알아? 아래의 답은 파이썬 문자열 리터럴 (예 :'repr')이지만 JSON 문자열 ('json.loads' 사용)이거나'\ u' 이스케이프를 사용하는 다른 형식 일 수 있다고 가정합니다 잠재적으로 다른 엣지 경우가 있습니다. 잘못된 형식을 선택하면 더 많은 mangling이 발생할 수 있습니다. – bobince

답변

5

먼저 인코딩이 문자열을 utf8로하고 : : 그런 다음 각각의 문자열을 당신은 int로 변환하고 다시 문자열로 chr와 함께 할 수

>>> line = "\"\\u4e2d\\u534e\\u8def\"" 
>>> line.encode('utf8').decode('unicode-escape') 
'"中华路"' 

그런 다음 필요에 따라 "을 제거 할 수 있습니다.

+0

'eval ("\"\\ u4e2d \\ u534e \\ u8def \ "")'는''中华 路 ''입니다. –

+0

@TerryJanReedy 당신은 절대적으로 옳습니다. 나는 python-3.5 태그를 보았지만 파이썬 2를 생각해봤을 것이다. 이 솔루션은 Python 2 또는 3에서 작동해야합니다 (OP가 특별히 묻지 않은 경우) – bunji

3

'\\u'stripsplit의 인용 부호를 제거 할 수 있습니다. 이렇게하면 16 진수를 나타내는 문자열로 문자가 표시됩니다. 당신을위한 \\ 처리 할 unicode-escape로 디코딩 한 다음

>>> street = "\"\\u4e2d\\u534e\\u8def\"" 
>>> ''.join(chr(int(x, 16)) for x in street.strip('"').split('\\u') if x) 
'中华路' 
+0

eval 함수를 사용하면 :'eval ("\"\\ u4e2d \\ u534e \\ u8def \ "")'는''中华 路 ''입니다. –

2

작성한 내용에 따라 데이터베이스에 평판이 좋은 ascii repr 비 유니 코드 문자를 사용하여 문자열을 이스케이프 처리합니다.

>>> eval("\"\\u4e2d\\u534e\\u8def\"") 
'中华路' 

파이썬에는이 기능이 내장되어 있습니다.

>>> ascii('中华路') 
"'\\u4e2d\\u534e\\u8def'" 

유일한 차이점은 필요한 내부 견적에 대한 \"의 사용 대신 '입니다.

관련 문제