2016-07-12 4 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' 

Как я могу получить тот же выход (и '\ u5e10 \ u6237') в Python3?


Редактировать

Для тех, кто еще с этой проблемой, я понял, посмотрев на ответы, которые, чтобы сделать использование результата каждый символ должен рассматриваться как отдельный элемент. Выделенное представление unicode, такое как '\ 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

Это кодировка «unicode-escape». Вот пример того, как можно было бы добиться такого поведения в Python3:

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').

1

Возвращение того же юникода, что и в python2, невозможно: я не видел unicode-объект, как в python2, в python3. Но можно получить значение объекта unicode.

Чтобы сделать это, вам нужно сделать несколько вещей:
- Создать байтовый элемент со значением '\ xe5 \ XB8 \ x90 \ XE6 \ x88 \ xb7' - Transform этого байтового элемента в строку - Получает код юникода из строки

Первый шаг довольно прост. Для создания БАЙТА элемент «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'), хотя это, скорее всего, менее эффективным.

Он принимает строку в качестве аргумента и возвращает строку с unicode вместо символа, который он представляет.

+0

Лично я бы написать эту функцию определения функции get_unicode_code (текст): результата = '' .join ( символа, если ог (символ) <128 еще '\\ и' + формат (ог (символ) , 'x') для символа в тексте ) ' –

+1

@JonathanHartley Спасибо, что исправили мой код и сделали его более питоническим. Эта функция возвращает то же самое, что и последняя строка декана 'd.encode ('unicode-escape'). Decode ('ascii')' Я исправил ошибку в круглых скобках и добавил еще один код, чтобы функция имела желаемый результат. Формат здесь, чтобы преобразовать int в его шестнадцатеричное значение, которое затем используется для ручного создания unicode – HolyDanna

+0

Спасибо, я получаю его сейчас! –

Смежные вопросы