Cách chuyển đổi một chuỗi thành utf-8 trong Python


192

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 truy xuất nó từ chuỗi truy vấn, mã hóa mà Python trả về là ASCII. Làm cách nào để chuyển đổi chuỗi đơn giản thành utf-8?

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


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

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

1
Năm 2018, python 3 nếu bạn gặp lỗi giải mã ascii do"some_string".encode('utf-8').decode('utf-8')
devssh

Câu trả lời:


265
>>> 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_ chuỗi) và chuỗi unicode.

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

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


34
, Tôi nhận được lỗi sau: UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteĐây là mã của tôi: ret = [] cho dòng trong csvReader: cline = [] cho elm trong dòng: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG

102
Không có điều 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

Loại va chạm này, nhưng cảm ơn. Điều này đã khắc phục sự cố trong đó tôi đang cố in unicode và đang nhận được.
智障 的

Làm thế nào để bạn chuyển đổi utrở lại một strđịnh dạng (chuyển đổi utrở lại s)?
Tanguy

3
Mã này sẽ chỉ hoạt động miễn là văn bản không chứa các ký tự không phải mã ascii; một ký tự có dấu đơn giản trên chuỗi sẽ làm cho nó thất bại.
Haroldo_OK

71

Nếu các phương thức trên không hoạt động, bạn cũng có thể yêu cầu Python bỏ qua các phần của chuỗi mà nó không thể chuyển đổi thành utf-8:

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

6
Có AttributionError: đối tượng 'str' không có thuộc tính 'giải mã'
saran3h

2
@ saran3h có vẻ như bạn đang sử dụng Python 3, trong trường hợp đó Python sẽ xử lý các vấn đề mã hóa cho bạn. Bạn đã thử đọc tài liệu của mình mà không chỉ định mã hóa chưa?
duhime

Python mặc định chọn mã hóa hệ thống. Trong windows 10, cp1252 khác với utf-8. Tôi đã lãng phí vài giờ cho nó trong khi sử dụng codec.open () trong py 3.8
Vishesh Mangla

21

Có thể hơi quá mức, nhưng khi tôi làm việc với ascii và unicode trong cùng một tệp, việc giải mã lặp lại 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

15

Thêm dòng sau vào đầu tệp .py của bạn:

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

cho phép bạn mã hóa chuỗi trực tiếp trong tập lệnh của mình, như thế này:

utfstr = "ボールト"

1
Đó không phải là những gì OP yêu cầu. Nhưng dù sao cũng nên tránh những 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 bytestring trong Python 2 (xấu). Hoặc thêm from __future__ import unicode_literalsở đầu hoặc sử dụng u''tiền tố. Đừng sử dụng các ký tự không phải ascii trong byteschữ. Để có được byte utf-8, bạn có thể utf8bytes = unicode_text.encode('utf-8')sau này nếu cần thiết.
jfs

1
@jfs làm thế nào để from __future__ import unicode_literalsgiúp tôi chuyển đổi một chuỗi với các ký tự không phải ascii thành utf-8?
Ortal Turgeman

@OrtalTurgeman Tôi không trả lời câu hỏi. Hãy nhìn xem, đó là một bình luận, không phải là một câu trả lời. Nhận xét của tôi giải quyết vấn đề với mã trong câu trả lời. Nó cố gắng tạo ra một bytestring với các ký tự không phải mã ascii trên Python 2 (đó là một SyntaxError trên Python 3 - byte bằng chữ cấm điều đó).
jfs

13

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

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

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

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

Hoặc là:

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

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

8

Trong Python 3.6, chúng không có phương thức unicode () tích hợp. Các chuỗi đã được lưu trữ dưới dạng unicode theo mặc định và không cần chuyển đổi. Thí dụ:

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

3

Dịch với ord () và unichar (). Mỗi char unicode có một số liên kết, một cái gì đó giống như một chỉ mục. Vì vậy, Python có một vài phương thức để dịch giữa char và số của anh ta. 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')
ñ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.