Giải mã Python Unicode không được hỗ trợ


81

Tôi đang gặp sự cố với mã hóa của mình bằng Python. Tôi đã thử các phương pháp khác nhau nhưng dường như không thể tìm ra cách tốt nhất để mã hóa đầu ra của mình thành UTF-8.

Đây là những gì tôi đang cố gắng làm:

result = unicode(google.searchGoogle(param), "utf-8").encode("utf-8")

searchGoogletrả về kết quả Google đầu tiên cho param.

Đây là lỗi tôi nhận được:

exceptions.TypeError: decoding Unicode is not supported

Có ai biết cách tôi có thể làm cho Python mã hóa đầu ra của tôi trong UTF-8 để tránh lỗi này không?

Câu trả lời:


102

Có vẻ như google.searchGoogle(param)đã trả lại unicode:

>>> unicode(u'foo', 'utf-8')

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    unicode(u'foo', 'utf-8')
TypeError: decoding Unicode is not supported

Vì vậy, những gì bạn muốn là:

result = google.searchGoogle(param).encode("utf-8")

Một lưu ý nhỏ, mã của bạn mong đợi nó trả về một utf-8chuỗi được mã hóa, vậy điểm nào trong việc giải mã nó (sử dụng unicode()) và mã hóa lại (sử dụng .encode()) bằng cách sử dụng cùng một mã hóa?


4
Thành thật mà nói, unicode()tôi chỉ đang đánh lừa xung quanh để cố gắng hiểu những gì đang xảy ra. Cảm ơn bạn rất nhiều :-)
simonbs

2
Bây giờ đôi khi tôi sẽ nhận được ascii' codec can't decode byte 0xc3 in position. bạn có biết tại sao như vậy không?
simonbs

2
Trong dòng tôi đề nghị? Sau đó, nó có nghĩa là searchGoogle () trả về một chuỗi có byte 0xC3. Gọi .encode()như vậy dẫn đến việc Python cố gắng chuyển đổi sang unicode trước (sử dụng mã hóa ascii). Tôi không biết tại sao searchGoogle () đôi khi trả về unicode và đôi khi là một chuỗi. Có lẽ nó phụ thuộc vào những gì bạn cho nó vào param? Cố gắng gắn bó với một loại.
yak

65
Tôi ước có một cách an toàn, đơn giản để truyền sang unicode.
Eric Walker

@EricWalker Bạn có thể viết một hàm trợ giúp khó xử như hàm def uors2u(object, encoding=..., errors=...)này sẽ trả về objectparam không thay đổi nếu nó đã có trong Unicode hoặc chuyển đổi nó nếu str. Tuy nhiên, mã này có mùi. Bạn nên chuyển đổi tất cả dữ liệu đầu vào sang Unicode ngay khi nhận được từ bên ngoài (như hệ thống tệp) và chuyển đổi lại nếu cần trước khi gửi lại. Chỉ nên có một nơi mà bạn chuyển đổi str sang unicode, vì vậy không cần đến hàm trợ giúp như chức năng tôi đã mô tả.
Leonid
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.