2016-07-12 5 views
3

일부 코드를 python2에서 python3으로 변환 중입니다.string.decode ('utf8')를 python2에서 python3으로 변환

python2, 나는 다음과 같은 작업을 수행 할 수 있습니다

>>> c = '\xe5\xb8\x90\xe6\x88\xb7' 
>>> print c 
帐户 
>>> c.decode('utf8') 
u'\u5e10\u6237' 

어떻게 얻을 수 같은 출력 (U '\ u5e10 u6237 \') python3에서?


편집

이 문제와 다른 사람을 위해, 나는 각 문자가 개별 요소로 취급 될 필요가 결과의 사용을 할 수있는 반응보고 후 깨달았다. '\ u5e10 \ u6237'와 같은 이스케이프 된 유니 코드 표현은 문자열이므로 자연스럽게 원래 중국어 문자에 해당하는 부분으로 나뉘 지 않습니다.

>>> c = '帐户' 
>>> type(c.encode('unicode-escape').decode('ascii')) 
<class 'str'> 
>>> [l for l in c.encode('unicode-escape').decode('ascii')] 
['\\', 'u', '5', 'e', '1', '0', '\\', 'u', '6', '2', '3', '7'] 

당신은 입력 문자열의 각 문자를 분리하고 프로그램의 다음 부분에 다시 구문 분석하지 않으려면 배열로 별도로 번역해야합니다. 내 솔루션 따라서이었다

>>> [l.encode('unicode-escape').decode('ascii') for l in c] 
['\\u5e10', '\\u6237'] 

대체 솔루션은 진수 표현으로 각 문자를합니다 도움을

>>> [hex(ord(l)) for l in c] 
['0x5e10', '0x6237'] 

감사합니다.

답변

3

"유니 코드 이스케이프"인코딩이라고합니다.

In [11]: c = b'\xe5\xb8\x90\xe6\x88\xb7' 

In [12]: d = c.decode('utf8') 

In [13]: print(d) 
帐户 

In [14]: print(d.encode('unicode-escape').decode('ascii')) 
\u5e10\u6237 
당신이 bytes로합니다

하지 str, 당신은 단순히 .decode('ascii') 제거 할 수 있습니다 여기에 하나 python3에서이 동작을 달성하는 방법에 대한 예입니다.

1

파이썬 2에서와 같은 유니 코드를 반환하는 것은 불가능합니다. 파이썬 2에서 파이썬 3과 같이 유니 코드 객체를 보지 못했습니다. 그러나 유니 코드 객체의 값을 가져 오는 것은 가능합니다.

이렇게하려면, 당신은 몇 가지 작업을 수행해야합니다
- 값 바이트 요소 만들기 '\ xe5 \ XB8 \ X90 \ XE6 \ x88 \ XB7' - 문자열 에이 바이트 요소를 변환 - 가져옵니다 문자열에서 유니 코드 코드

첫 번째 단계는 매우 쉽습니다. 당신의 C와 같은 값으로 바이트 요소 'C'를 만들려면 바로 수행

c = b'\xe5\xb8\x90\xe6\x88\xb7' 

을 다음으로 문자열을 변환하는

c_string = c.decode() # default encoding is utf-8 

마지막으로, 내가 만든 요소를 ​​함수를 읽기 그것은 가장 가능성이 덜 효율적 비록 그 문자 + 유니 코드 표현은

def get_unicode_code(text): 
    result = "" 
    for char in text: 
     ord_value = ord(char) 
     if ord_value < 128: 
      result += char 
     else: 
      hex_string = format(ord_value, "x") # turning the int into its hex value 
      if len(hex_string) == 2: 
       unicode_code = "\\x"+hex_string 
      elif len(hex_string) == 3: 
       unicode_code = "\\u0"+hex_string 
      else: 
       unicode_code = "\\u"+hex_string 
      result += unicode_code 
    return result 

get_unicode_code(d), d.encode('unicode-escape').decode('ascii') 같은를 반환합니다.

문자열을 인수로 취해 그 문자 대신 유니 코드로 문자열을 반환합니다.

+0

는 개인적으로 그 기능을 써서 'DEF get_unicode_code (텍스트) 결과 ='.join ( CHAR 경우 ORD (숯) <128 다른 '\\ U'+ 포맷 (ORD 샤아 , 'x') 문자로 된 )' –

+1

@JonathanHartley 내 코드를 수정 해 주셔서 감사합니다. 이 함수는 Dean의 마지막 줄'd.encode ('unicode-escape')와 동일한 것을 반환합니다. decode ('ascii')' 괄호 오류를 수정하고 함수에 원하는 결과를주기위한 코드를 추가했습니다. 형식은 int를 16 진수 값으로 변환합니다.이 값은 유니 코드를 수동으로 생성하는 데 사용됩니다. – HolyDanna

+0

감사합니다. 지금 받으십시오! –

관련 문제