Як перетворити рядок у utf-8 в Python


193

У мене є браузер, який надсилає utf-8 символів на мій сервер Python, але коли я отримую його з рядка запиту, кодування, яке повертає Python, це ASCII. Як я можу перетворити просту рядок у utf-8?

ПРИМІТКА: Рядок, переданий з Інтернету, вже закодований UTF-8, я просто хочу зробити так, щоб Python розглядав його як UTF-8, а не ASCII.


Спробуйте це посилання http://evanjones.ca/python-utf8.html
Mudassir

Я думаю, що кращим буде заголовок: Як примусити рядок до Unicode без перекладу?
boatcoder

1
У 2018 році python 3, якщо ви отримаєте помилку декодування ascii do"some_string".encode('utf-8').decode('utf-8')
devssh

Відповіді:


267
>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^ Це різниця між байтовим рядком (звичайним рядком) і рядком Unicode.

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ Перетворення в unicode та вказівка ​​кодування.


34
, Я отримую таку помилку: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteЦе мій код: ret = [] для рядка в csvReader: cline = [] для elm у рядку: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG

105
Нічого з цього не застосовується в Python 3, всі рядки є unicode і unicode()не існує.
Номенон

Добре наткнувшись на це, але дякую. Це вирішило проблему, коли я намагався надрукувати unicode і отримував s.
智障 的 人

Як конвертувати uназад у strформат (перетворити uназад у s)?
Тангуй

3
Цей код буде працювати лише до тих пір, поки текст не містить символів, що не відносяться до нього; простий наголошений символ у рядку зробить його невдалим.
Haroldo_OK

71

Якщо описані вище методи не працюють, ви також можете сказати Python ігнорувати частини рядка, які він не може перетворити на utf-8:

stringnamehere.decode('utf-8', 'ignore')

6
Отримав AttributeError: 'str' об’єкт не має атрибута 'декодування'
saran3h

2
@ saran3h це здається, що ви використовуєте Python 3, і в цьому випадку Python повинен вирішувати проблеми кодування для вас. Ви спробували прочитати документ, не вказавши кодування?
duhaime

Python за замовчуванням вибирає кодування системи. У Windows 10 це cp1252, який відрізняється від utf-8. Я витратив на нього кілька годин, використовуючи codecs.open () у py 3.8
Vishesh Mangla

21

Це може бути трохи зайвим, але коли я працюю з ascii та unicode в одних і тих же файлах, повторення декодування може бути болем, це те, що я використовую:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input

15

Додавання наступного рядка до верхньої частини вашого .py-файлу:

# -*- coding: utf-8 -*-

дозволяє кодувати рядки безпосередньо у вашому сценарії, наприклад:

utfstr = "ボールト"

1
ОП не просить. Але уникайте таких рядкових літералів все одно. Він створює рядок Unicode в Python 3 (хороший), але це бітестрінг в Python 2 (погано). Або додайте from __future__ import unicode_literalsвгорі або використовуйте u''префікс. Не використовуйте символи non-ascii в bytesлітералах. Щоб отримати utf-8 байт, ви можете utf8bytes = unicode_text.encode('utf-8')пізніше, якщо це необхідно.
jfs

1
@jfs як from __future__ import unicode_literalsдопоможе мені перетворити рядок з символами, які не належать ascii, до utf-8?
Ortal Turgeman

@OrtalTurgeman Я не відповідаю на питання. Подивіться, це коментар, а не відповідь. Мій коментар вирішує питання з кодом у відповіді. Він намагається створити байтінг-трейдинг з символами, що не входять в ascii, на Python 2 (це SyntaxError на Python 3 - літери, що забороняють це).
jfs

13

Якщо я вас правильно зрозумів, у вашому коді є закодований байт-рядок utf-8.

Перетворення ряду байтів у рядок unicode відоме як декодування (unicode -> byte-string є кодуванням).

Ви робите це, використовуючи функцію unicode або метод декодування . Або:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

Або:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")


8

У Python 3.6 вони не мають вбудованого методу unicode (). Рядки вже за замовчуванням зберігаються як unicode, і перетворення не потрібно. Приклад:

my_str = "\u221a25"
print(my_str)
>>> 25

3

Перекладіть з ord () та unichar (). Кожен знак unicode має асоційоване число, щось на зразок індексу. Тож у Python є кілька методів перекладу знака та його кількості. Нижня частина - приклад. Сподіваюся, це може допомогти.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.