Как преобразовать строку в UTF-8 в Python

193

У меня есть браузер, который отправляет символы utf-8 на мой сервер Python, но когда я получаю его из строки запроса, Python возвращает кодировку ASCII. Как я могу преобразовать простую строку в UTF-8?

ПРИМЕЧАНИЕ. Строка, передаваемая из Интернета, уже закодирована в UTF-8, я просто хочу, чтобы Python рассматривал ее как UTF-8, а не ASCII.

Бен Чен
источник
Попробуйте эту ссылку http://evanjones.ca/python-utf8.html
Mudassir
Я думаю, что лучшим названием будет Как
Боевой кодер
1
В 2018 году Python 3, если вы получите ошибку декодирования ascii, сделает"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'>)

^ Это разница между байтовой строкой (plain_string) и строкой Unicode.

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

^ Преобразование в Unicode и указание кодировки.

user225312
источник
34
, Я получаю следующую ошибку: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteЭто мой код: ret = [] для строки в csvReader: cline = [] для строки в строке: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Гопакумар Н.Г.
107
Ничего из этого не применимо в Python 3, все строки в Unicode и unicode()не существуют.
Нумен
Вроде наткнулся на это, но спасибо. Это исправило проблему, когда я пытался напечатать Unicode и получал s.
智障 的 人
Как конвертировать uобратно в strформат (конвертировать uобратно в s)?
Танги
3
Этот код будет работать только до тех пор, пока текст не содержит символы, отличные от ascii; простой акцентированный символ в строке приведет к сбою.
Haroldo_OK
71

Если описанные выше методы не работают, вы также можете указать Python игнорировать части строки, которые он не может преобразовать в utf-8:

stringnamehere.decode('utf-8', 'ignore')
duhaime
источник
6
Получил AttributeError: у объекта 'str' нет атрибута '
decode
2
@ saran3h Похоже, вы используете Python 3, и в этом случае Python должен решить проблемы с кодированием для вас. Вы пытались читать документ без указания кодировки?
Духайме
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
Blueswannabe
источник
15

Добавив следующую строку в начало вашего .py файла:

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

позволяет вам кодировать строки непосредственно в вашем скрипте, например так:

utfstr = "ボールト"
кругозор
источник
1
Это не то, что спрашивает ОП. Но все равно избегайте таких строковых литералов. Он создает строку Unicode в Python 3 (хорошо), но это строка байтов в Python 2 (плохо). Либо добавьте from __future__ import unicode_literalsсверху или используйте u''префикс. Не используйте не-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")
codeape
источник
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
источник
8

В Python 3.6 у них нет встроенного метода unicode (). По умолчанию строки уже сохранены как Unicode, и преобразование не требуется. Пример:

my_str = "\u221a25"
print(my_str)
>>> 25
Zld Productions
источник
3

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

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
Joe9008
источник
0

Да, вы можете добавить

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

в первой строке вашего исходного кода.

Вы можете прочитать более подробную информацию здесь https://www.python.org/dev/peps/pep-0263/

David-Star
источник