2017-11-16 1 views
10

에 음, 내가 먼저 문제를 소개하겠습니다.변환 파이썬 3 문자열 -`STR (utf8_encoded_str)`다시 유니 코드

POST/GET 요청을 통해 데이터를 얻었습니다. 데이터는 UTF-8로 인코딩 된 문자열입니다. 거의 알지 못했고, 단지 str() 방법으로 변환했습니다. 그리고 지금 나는 "말도 안되는 데이터"의 완전한 데이터베이스를 가지고 있으며, 길을 찾을 수 없습니다.

예제 코드 :

unicode_str이 -이 내가

encoded_str을 받아야 문자열입니다 - 이것은 내가 POST/GET 요청을받은 문자열입니다 - 초기 데이터

bad_str - 현재 데이터베이스에있는 데이터이며 유니 코드를 가져와야합니다.

그래서 나는 변환하는 방법을 알고 분명히 : : = (encode) =>encoded_str = (str) =>bad_str

하지만 다시 솔루션을 가지고 올 수없는 unicode_str bad_str = (???) = "encoded_str = (decode) ="

,617 unicode_str
In [1]: unicode_str = 'Příliš žluťoučký kůň úpěl ďábelské ódy' 

In [2]: unicode_str 
Out[2]: 'Příliš žluťoučký kůň úpěl ďábelské ódy' 

In [3]: encoded_str = unicode_str.encode("UTF-8") 

In [4]: encoded_str 
Out[4]: b'P\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88 \xc3\xbap\xc4\x9bl \xc4\x8f\xc3\xa1belsk\xc3\xa9 \xc3\xb3dy' 

In [5]: bad_str = str(encoded_str) 

In [6]: bad_str 
Out[6]: "b'P\\xc5\\x99\\xc3\\xadli\\xc5\\xa1 \\xc5\\xbelu\\xc5\\xa5ou\\xc4\\x8dk\\xc3\\xbd k\\xc5\\xaf\\xc5\\x88 \\xc3\\xbap\\xc4\\x9bl \\xc4\\x8f\\xc3\\xa1belsk\\xc3\\xa9 \\xc3\\xb3dy'" 

In [7]: new_encoded_str = some_magical_function_here(bad_str) ??? 

답변

11

당신은 바이트 객체의 단지 표현 인 문자열로 바이트 객체를 돌았 다. ast.literal_eval() (제안 사항에 대해 Mark Tolonen에게 크레디트)을 사용하면 원래의 바이트 개체를 얻을 수 있으며 간단한 decode()이 작업을 수행합니다.

당신이 안전 할 것 eval()를 사용하여 문자열을 생성하지만, 왜 안전 할 사람 이었기 때문에
>>> import ast 
>>> ast.literal_eval(bad_str).decode('utf-8') 
'Příliš žluťoučký kůň úpěl ďábelské ódy' 

?

+0

잘, 나는'마음도 eval'했지만, 거기에 어떤 데이터입니다 내가 알고하지 않기 때문에 많은 양의 데이터가, 내가했다 나는 이것을 회피 할 수 있기를 바랬다. 하지만 고마워요 :) – darkless

+4

@darkless 저장 한 문자열이 어떻게 생겼는지는 중요하지 않습니다. utf-8 문자열 가져 오기 -> 바이트 개체로 인코딩 -> ** ** 문자열로 변환하여 데이터베이스에 저장하는 절차를 수행하는 동안 해당 문자열을 무해한 바이트 개체로 보장 할 수 있습니다. – Reti43

+0

사실, 모든 저장된 문자열은 "b '...'"e "가 b '...'로 해석되어야 함을 깨닫지 못했습니다. – darkless

1

대신, 평가 후면 사용하지 마십시오 :

import codecs 
s = 'žluťoučký' 
x = str(s.encode('utf-8')) 

# strip quotes 
x = x[2:-1] 

# unescape 
x = codecs.escape_decode(x)[0].decode('utf-8') 

# profit 
x == s 
+0

비표준 버전을 가져 주셔서 감사합니다. 이중 슬래시를 단일 슬래시로 바꾸려면'escape_decode'가 누락되었습니다.그래도 방법에 대한 문서를 찾을 수 없습니다. https://docs.python.org/3.5/library/codecs.html – darkless

관련 문제