Python'da bir dizeyi utf-8'e dönüştürme


193

Python sunucuma utf-8 karakter gönderen bir tarayıcı var, ancak sorgu dizesinden aldığımda, Python döndürdüğü kodlama ASCII olduğunu. Düz dizeyi utf-8'e nasıl dönüştürebilirim?

Not: Web'den geçirilen dize zaten UTF-8 kodlu, ben sadece Python ASCII değil UTF-8 olarak tedavi etmek istiyorum.



Daha iyi bir başlık olacağını düşünüyorum nasıl çeviri olmadan unicode bir dize zorlamak için?
boatcoder

1
2018'de, ascii kod çözme hatası alırsanız python 3"some_string".encode('utf-8').decode('utf-8')
devssh

Yanıtlar:


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

^ Bu bir bayt dizesi (düz_dizesi) ve bir unicode dizesi arasındaki farktır.

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

^ Unicode'a dönüştürme ve kodlamayı belirleme.


34
, Aşağıdaki hatayı alıyorum: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteBu benim kod: ret = [] csvReader satır için: cline = [] karaağaç satır için: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG

105
Python 3'te bunların hiçbiri geçerli değildir, tüm dizeler unicode'dur ve unicode()mevcut değildir.
Noumenon

Biraz çarptı ama teşekkürler. Bu, unicode yazdırmaya çalıştığım ve gettings aldığım bir sorunu düzeltti.
人 的 ​​人

uBir strformata nasıl dönüştürebilirsiniz ( ugeri dönüş s)?
Tanguy

3
Bu kod yalnızca metin ascii olmayan karakterler içermediği sürece çalışır; dizedeki basit aksanlı bir karakter dizinin başarısız olmasına neden olur.
Haroldo_OK

71

Yukarıdaki yöntemler işe yaramazsa, Python'a bir dizenin utf-8'e dönüştüremediği kısımlarını yoksaymasını da söyleyebilirsiniz:

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

6
AttributeError: 'str' nesnesinin 'decode' özelliği yok
saran3h

2
@ saran3h Python 3'ü kullandığınız anlaşılıyor, bu durumda Python sizin için kodlama sorunlarını ele almalıdır . Kodlama belirtmeden belgenizi okumayı denediniz mi?
duhaime

Python varsayılan olarak sistem kodlamasını seçer. Windows 10'da utf-8'den farklı olan cp1252. Py 3.8'de codecs.open () kullanırken birkaç saat harcadım
Vishesh Mangla

21

Biraz abartılı olabilir, ancak aynı dosyalarda ascii ve unicode ile çalıştığımda, tekrar kod çözme bir acı olabilir, kullandığım şey bu:

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

15

.Py dosyanızın üstüne aşağıdaki satırı ekleme:

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

dizeleri doğrudan betiğinizde şu şekilde kodlamanıza olanak tanır:

utfstr = "ボールト"

1
OP'nin sorduğu şey bu değil. Ama yine de böyle dizgi değişmezlerinden kaçının. Python 3'te (iyi) Unicode dizesi oluşturur, ancak Python 2'de (kötü) bir testtir. from __future__ import unicode_literalsEn üste ekleyin veya u''önek kullanın . bytesDeğişmez değerlerde ascii olmayan karakterler kullanmayın . Utf-8 bayt almak için daha utf8bytes = unicode_text.encode('utf-8')sonra gerekliyse yapabilirsiniz.
jfs

1
@jfs from __future__ import unicode_literalsascii olmayan karakterler içeren bir dizeyi utf-8'e dönüştürmeme nasıl yardımcı olacak ?
Ortal Turgeman

@OrtalTurgeman Soruya cevap vermiyorum. Bak, bu bir yorum, cevap değil. Yorumum, yanıttaki kodla ilgili sorunu giderir. Python 2'de ascii olmayan karakterlerle bir sınama oluşturmaya çalışır (Python 3'te bir SyntaxError - bayt değişmezleri bunu yasaklar).
jfs

13

Sizi doğru anlarsam, kodunuzda utf-8 kodlu bir bayt dizesi bulunur.

Bayt dizesini bir unicode dizeye dönüştürmek kod çözme olarak bilinir (unicode -> bayt dizesi kodlamadır).

Bunu unicode işlevini veya kod çözme yöntemini kullanarak yaparsınız . Ya:

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

Veya:

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

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

8

Python 3.6'da yerleşik bir unicode () yöntemi yoktur. Dizeler varsayılan olarak zaten unicode olarak saklanır ve herhangi bir dönüştürme gerekmez. Misal:

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

3

Ord () ve unichar () ile tercüme edin. Her unicode karakterinin bir indeksi gibi bir numarası vardır. Yani Python'un bir karakter ve numarası arasında çeviri yapmak için birkaç yöntemi var. Olumsuz ñ örneğidir. Umarım yardımcı olabilir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.