2012-05-07 34 views
6

Có ai giải thích cho tôi hành vi kỳ lạ này không? Tôi hy vọng cả hai phương pháp thay thế sẽ hoạt động hoặc không hoạt động cùng một lúc. Có phải chỉ là tôi hay có ai không tìm thấy điều này để kết hợp không?Hành vi lạ của re.sub với các chuỗi utf-8

>>> u'è'.replace("\xe0","") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) 
>>> re.sub(u'è','\xe0','',flags=re.UNICODE) 
'' 

(Xin lưu ý rằng tôi không yêu cầu một lời giải thích về việc tại sao u'è'.replace ("\ xe0", "") đặt ra một lỗi!)

+0

'unicode.replace' không giống phương thức' re.sub'. – Daenyth

+0

Tất nhiên. Và quan điểm của tôi là họ nên cư xử mạch lạc cho cùng một yếu tố đầu vào. – luke14free

+1

Đó là những câu hỏi như thế này dẫn đến việc thực thi chặt chẽ hơn các chuỗi Unicode so với Byte trong Python 3. –

Trả lời

2

Từ Unicode Doc

đối số cho các phương pháp này có thể là chuỗi Unicode hoặc 8-bit chuỗi. Các chuỗi 8 bit sẽ được chuyển thành Unicode trước khi thực hiện thao tác ; mã hóa ASCII mặc định Python sẽ được sử dụng, vì vậy ký tự lớn hơn 127 sẽ gây ra một ngoại lệ

Từ Re Doc:

Module này cung cấp biểu thức chính quy phù hợp với các hoạt động tương tự như những mặt hàng trong Perl. Cả hai mẫu và chuỗi được tìm kiếm có thể là chuỗi Unicode cũng như các chuỗi 8 bit.

Vì mô đun Re bạn không chỉ định rõ cờ Unicode, nó không cố gắng chuyển đổi và do đó không làm tăng lỗi. Đó là lý do tại sao chúng không hoạt động mạch lạc

+0

Mhh. Không quá đồng tiền về điều cờ; >>> re.sub (u'è ',' \ xe0 ',' ', flags = re.UNICODE) vẫn cung cấp cho tôi trở lại' ' – luke14free

+0

Hoàn toàn có thể cho mô-đun lại bắt được ngoại lệ đó và không minh bạch về nó, chỉ là linh cảm, không được xác nhận. – subiet

+1

Đã không làm việc cho tôi: (Python là hoàn toàn khủng khiếp với sự hỗ trợ unicode.Tôi đã lãng phí 3 ngày nay và vẫn không thể hoàn thành một chức năng đọc-thay đổi-ghi siêu đơn giản. – oriadam

0

Python 2.X có xử lý mã hóa hơi không tự nhiên, điều này sẽ chuyển đổi ẩn. Nó sẽ cố gắng chơi với các chuỗi unicode và no-unicode, khi chuyển đổi không được người dùng quan tâm. Cuối cùng, điều đó không giải quyết được vấn đề: mã hóa phải được nhà phát triển thừa nhận từ khi bắt đầu. Python 2 chỉ làm cho mọi thứ ít rõ ràng hơn và ít rõ ràng hơn một chút.

>>> u'è'.replace(u"\xe0", u"") 
u'\xe8' 

Đó là ví dụ ban đầu của bạn, ngoại trừ, tôi đặc biệt nói với Python rằng tất cả các chuỗi đều là unicode. Nếu không, Python sẽ cố gắng chuyển đổi chúng. Và vì mã hóa mặc định trong Python 2 là ASCII, điều này rõ ràng sẽ không thành công với ví dụ của bạn.

Mã hóa là một chủ đề khó, nhưng với một số thói quen tốt (như chuyển đổi sớm, luôn luôn chắc chắn về loại dữ liệu được chương trình xử lý tại một điểm nhất định), nó thường (và tôi nhấn mạnh, USUALLY) .

Hy vọng điều đó sẽ hữu ích!