Bagaimana mengkonversi string ke utf-8 dengan Python

193

Saya memiliki browser yang mengirim karakter utf-8 ke server Python saya, tetapi ketika saya mengambilnya dari string kueri, pengkodean yang dikembalikan Python adalah ASCII. Bagaimana saya bisa mengkonversi string polos ke utf-8?

CATATAN: String yang diteruskan dari web sudah dikodekan UTF-8, saya hanya ingin membuat Python untuk memperlakukannya sebagai UTF-8 bukan ASCII.

Bin Chen
sumber
Coba tautan ini http://evanjones.ca/python-utf8.html
Mudassir
Saya pikir judul yang lebih baik adalah Bagaimana cara memaksa string untuk unicode tanpa terjemahan?
boatcoder
1
Pada 2018, python 3 jika Anda mendapatkan ascii decode error do"some_string".encode('utf-8').decode('utf-8')
devssh

Jawaban:

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

^ Ini adalah perbedaan antara string byte (plain_string) dan string unicode.

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

^ Mengubah ke unicode dan menentukan pengkodean.

pengguna225312
sumber
34
, Saya mendapatkan kesalahan berikut: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteIni adalah kode saya: ret = [] untuk baris di csvReader: cline = [] untuk elm di baris: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG
102
Semua ini tidak berlaku di Python 3, semua string adalah unicode dan unicode()tidak ada.
Noumenon
Agak menabrak ini, tapi terima kasih. Ini memperbaiki masalah di mana saya mencoba untuk mencetak unicode dan mendapatkan s.
智障 的 人
Bagaimana Anda mengonversi ukembali ke strformat (konversi ukembali ke s)?
Tanguy
3
Kode ini hanya akan berfungsi selama teks tidak mengandung karakter non-ascii; karakter beraksen sederhana pada string akan membuatnya gagal.
Haroldo_OK
71

Jika metode di atas tidak berfungsi, Anda juga bisa memberi tahu Python untuk mengabaikan bagian dari string yang tidak dapat dikonversi ke utf-8:

stringnamehere.decode('utf-8', 'ignore')
duhaime
sumber
6
Mendapat AttributeError: objek 'str' tidak memiliki atribut 'decode'
saran3h
2
@ saran3h sepertinya Anda menggunakan Python 3, dalam hal ini Python harus menangani masalah penyandian untuk Anda. Sudahkah Anda mencoba membaca dokumen Anda tanpa menentukan penyandian?
duhaime
Python secara default memilih pengkodean sistem. Di windows 10 itu cp1252 yang berbeda dari utf-8. Saya menyia-nyiakan beberapa jam untuk itu saat menggunakan codecs.open () di py 3.8
Vishesh Mangla
21

Mungkin sedikit berlebihan, tetapi ketika saya bekerja dengan ascii dan unicode dalam file yang sama, mengulangi decode bisa menyebalkan, inilah yang saya gunakan:

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

Menambahkan baris berikut ke bagian atas file .py Anda:

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

memungkinkan Anda untuk menyandikan string secara langsung di skrip Anda, seperti ini:

utfstr = "ボールト"
Ken
sumber
1
Bukan itu yang diminta OP. Tapi hindari string literal semacam itu. Ini menciptakan string Unicode dalam Python 3 (baik) tetapi merupakan bytestring dalam Python 2 (buruk). Tambahkan from __future__ import unicode_literalsdi bagian atas atau gunakan u''awalan. Jangan gunakan karakter non-ascii dalam bytesliteral. Untuk mendapatkan utf-8 byte, Anda bisa utf8bytes = unicode_text.encode('utf-8')nanti jika perlu.
jfs
1
@ jfs bagaimana akan from __future__ import unicode_literalsmembantu saya untuk mengkonversi string dengan karakter non-ascii ke utf-8?
Ortal Turgeman
@OrtalTurgeman Saya tidak menjawab pertanyaan. Lihat, itu adalah komentar, bukan jawaban. Komentar saya membahas masalah dengan kode dalam jawaban. Itu mencoba untuk membuat bytestring dengan karakter non-ascii pada Python 2 (itu adalah SyntaxError on Python 3 - byte literal melarang itu).
jfs
13

Jika saya mengerti Anda dengan benar, Anda memiliki byte-string yang dikodekan utf-8 dalam kode Anda.

Mengubah byte-string ke string unicode dikenal sebagai decoding (unicode -> byte-string sedang encoding).

Anda melakukannya dengan menggunakan fungsi unicode atau metode decode . Antara:

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

Atau:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
kode kode
sumber
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
sumber
8

Dalam Python 3.6, mereka tidak memiliki metode built-in unicode (). String sudah disimpan sebagai unicode secara default dan tidak diperlukan konversi. Contoh:

my_str = "\u221a25"
print(my_str)
>>> 25
Produksi Zld
sumber
3

Terjemahkan dengan ord () dan unichar (). Setiap karakter unicode memiliki nomor yang terkait, seperti indeks. Jadi Python memiliki beberapa metode untuk menerjemahkan antara char dan nomornya. Kelemahan adalah contoh ñ. Semoga bisa membantu.

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