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.



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.


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

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

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 = "ボールト"

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")

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.