2010-11-15 47 views
118

Tôi có một trình duyệt gửi các ký tự utf-8 đến máy chủ Python của tôi, nhưng khi tôi lấy nó từ chuỗi truy vấn, mã hóa mà Python trả về là ASCII. Làm thế nào tôi có thể chuyển đổi chuỗi đơn giản thành utf-8?Cách chuyển đổi chuỗi thành utf-8 bằng Python

LƯU Ý: Chuỗi được chuyển từ web đã được mã hóa UTF-8, tôi chỉ muốn làm cho Python coi nó là UTF-8 chứ không phải ASCII.

+0

Hãy thử liên kết này [http://evanjones.ca/python-utf8.html](http://evanjones.ca/python-utf8.html) – Mudassir

+0

Tôi nghĩ rằng một tiêu đề tốt hơn sẽ là ** Làm thế nào để ép buộc một chuỗi để unicode mà không cần dịch?** – boatcoder

Trả lời

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

^Đây là sự khác biệt giữa chuỗi byte (plain_string) và chuỗi unicode.

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

^Chuyển đổi thành unicode và chỉ định mã hóa.

+25

, tôi nhận được lỗi sau: 'UnicodeDecodeError: 'utf8' giải mã không thể giải mã byte 0xb0 ở vị trí 2: khởi động không hợp lệ byte' này được mã của tôi: ret = [] cho dòng trong CSVReader : Cline = [] cho elm phù hợp: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret.append (Cline) –

+29

Không ai trong số này áp dụng trong Python 3, tất cả các chuỗi là unicode và 'unicode()' không tồn tại. – Noumenon

+0

Loại va chạm này, nhưng cảm ơn. Điều này cố định một vấn đề mà tôi đã cố gắng để in unicode và đã nhận được s. –

10

Nếu tôi hiểu chính xác bạn, bạn có chuỗi byte được mã hóa utf-8 trong mã của mình.

Chuyển đổi chuỗi byte thành chuỗi unicode được gọi là giải mã (unicode -> byte-string được mã hóa).

Bạn làm điều đó bằng cách sử dụng hàm unicode hoặc phương pháp decode. Hoặc:

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

Hoặc:

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

Nếu các phương pháp trên không hiệu quả, bạn cũng có thể nói với Python để bỏ qua các phần của một chuỗi mà nó không thể chuyển đổi sang utf-8:

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

Uff, cảm ơn rất nhiều, sự hòa bình của mã cuối cùng đã kết thúc sự cố minidom của tôi! – Alex

+15

* hòa bình mã * .... không chắc chắn nếu gõ ... – user1717828

11

Thêm dòng sau vào phía trên cùng của tập tin py của bạn:

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

cho phép bạn mã hóa chuỗi trực tiếp trong kịch bản của bạn, như thế này:

utfstr = "ボールト" 
+1

Nó không phải là những gì OP yêu cầu. Tuy nhiên, tránh các chuỗi ký tự như vậy. Nó tạo ra chuỗi Unicode trong Python 3 (tốt) nhưng nó là một thuật ngữ trong Python 2 (xấu). Hoặc thêm 'từ __future__ nhập unicode_literals' ở trên cùng hoặc sử dụng tiền tố' u'''. Không sử dụng các ký tự không phải ascii trong các byte 'bytes'. Để nhận được các byte utf-8, bạn có thể 'utf8bytes = unicode_text.encode ('utf-8')' sau này nếu cần. – jfs

15

Có thể là một chút quá mức cần thiết, nhưng khi tôi làm việc với ascii và unicode trong cùng một file, lặp đi lặp lại giải mã có thể là một nỗi đau, đây là những gì Tôi sử dụng:

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

Trong Python 3.6, chúng không có hàm unicode() tích hợp sẵn. Để chuyển đổi một chuỗi unicode, chỉ cần nhận được giá trị unicode của nhân vật, và làm điều này:

my_str = "\u221a25" 
my_str = u"{}".format(my_str) 
print(my_str) 
>>> √25 
5
city = 'Ribeir\xc3\xa3o Preto' 
print city.decode('cp1252').encode('utf-8') 
+0

Sau nhiều giờ cố đọc một tệp có tên thành phố, điều này cuối cùng cũng hiệu quả. – Christian

1

Dịch với ord() và unichar(). Mỗi char unicode có một số asociated, một cái gì đó giống như một chỉ mục. Vì vậy, Python có một vài phương pháp để dịch giữa một char và số của mình. Nhược điểm là một ví dụ. Hy vọng nó có thể giúp đỡ.

>>> C = 'ñ' 
>>> U = C.decode('utf8') 
>>> U 
u'\xf1' 
>>> ord(U) 
241 
>>> unichr(241) 
u'\xf1' 
>>> print unichr(241).encode('utf8') 
ñ 
Các vấn đề liên quan