2013-08-12 37 views
46

Câu hỏi này được liên kết với Searching for Unicode characters in PythonPython unicode so sánh bằng thất bại

Tôi đọc file văn bản unicode sử dụng codec python

codecs.open('story.txt', 'rb', 'utf-8-sig') 

Và đã cố gắng để tìm kiếm chuỗi trong đó. Nhưng tôi nhận được cảnh báo sau.

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 

Có cách nào đặc biệt so sánh chuỗi unicode không?

+1

Liên kết này có thể hữu ích: http://nedbatchelder.com/text/unipain.html –

+0

Vui lòng đăng một chương trình ví dụ hoàn chỉnh ngắn, khép kín. Giảm mã của bạn xuống chương trình năm đến mười dòng tạo ra thông báo lỗi đó và đăng chương trình ngắn vào câu hỏi của bạn. Xem http://SSCCE.ORG để biết thêm thông tin. –

Trả lời

64

Bạn có thể sử dụng toán tử == để so sánh các đối tượng unicode cho bình đẳng.

>>> s1 = u'Hello' 
>>> s2 = unicode("Hello") 
>>> type(s1), type(s2) 
(<type 'unicode'>, <type 'unicode'>) 
>>> s1==s2 
True 
>>> 
>>> s3='Hello'.decode('utf-8') 
>>> type(s3) 
<type 'unicode'> 
>>> s1==s3 
True 
>>> 

Nhưng, thông báo lỗi của bạn cho thấy rằng bạn không so sánh đối tượng unicode. Bạn có lẽ so sánh một đối tượng unicode đến một đối tượng str, như vậy:

>>> u'Hello' == 'Hello' 
True 
>>> u'Hello' == '\x81\x01' 
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
False 

Xem làm thế nào tôi đã cố gắng để so sánh một đối tượng unicode chống lại một chuỗi mà không đại diện cho một mã hóa UTF8 hợp lệ.

Chương trình của bạn, tôi giả sử, là so sánh các đối tượng unicode với các đối tượng str và nội dung của đối tượng str không phải là mã hóa UTF8 hợp lệ. Điều này có vẻ là kết quả của bạn (lập trình viên) không biết biến nào giữ nguyên tử, biến nào giữ UTF8 và biến nào giữ byte được đọc từ một tệp.

Tôi khuyên bạn nên http://nedbatchelder.com/text/unipain.html, đặc biệt là lời khuyên để tạo "Bánh răng Unicode".

+2

'u'Hello '==' \ xc3 \ x81'' là hợp lệ UTF-8 và vẫn đưa ra cảnh báo. Trên Python 2, codec mặc định là 'ascii'. –

+0

Bạn chính xác. –

+0

Tôi nhận được cảnh báo tương tự trong tập lệnh của mình trong dòng này: 'hostnames = [] ... nếu không (tên trong tên máy chủ): ...' trong đó 'name' chứa một số chuỗi trong vòng lặp khác. Bạn có thể vui lòng thêm một ví dụ làm thế nào để sửa chữa như vậy? – rubo77