UTF-8 là mã hóa unicode sử dụng nhiều hơn một byte cho các ký tự đặc biệt. Nếu bạn không muốn độ dài của chuỗi được mã hóa, hãy giải mã đơn giản và sử dụng len()
trên đối tượng unicode
(và không phải đối tượng str
!).
Dưới đây là một số ví dụ:
>>> # creates a str literal (with utf-8 encoding, if this was
>>> # specified on the beginning of the file):
>>> len('ë́aúlt')
9
>>> # creates a unicode literal (you should generally use this
>>> # version if you are dealing with special characters):
>>> len(u'ë́aúlt')
6
>>> # the same str literal (written in an encoded notation):
>>> len('\xc3\xab\xcc\x81a\xc3\xbalt')
9
>>> # you can convert any str to an unicode object by decoding() it:
>>> len('\xc3\xab\xcc\x81a\xc3\xbalt'.decode('utf-8'))
6
Tất nhiên, bạn cũng có thể truy cập vào các nhân vật duy nhất trong một đối tượng unicode
như bạn sẽ làm gì trong một đối tượng str
(họ đều kế thừa từ basestring
và do đó có những phương pháp tương tự):
>>> test = u'ë́aúlt'
>>> print test[0]
ë
Nếu bạn phát triển các ứng dụng cục bộ, nó thường là một ý tưởng tốt để sử dụng chỉ unicode
-objects nội bộ, bằng cách giải mã tất cả các đầu vào bạn nhận được. Sau khi hoàn thành công việc, bạn có thể mã hóa kết quả lại thành 'UTF-8'. Nếu bạn giữ nguyên tắc này, bạn sẽ không bao giờ thấy máy chủ của bạn rơi vì bất kỳ UnicodeDecodeError
s nội bạn có thể nhận thức khác;)
PS: Xin lưu ý, rằng str
và unicode
datatype đã thay đổi đáng kể trong Python 3. Trong Python 3 chỉ có chuỗi unicode và chuỗi byte đơn giản mà không thể trộn lẫn được nữa. Điều đó sẽ giúp tránh cạm bẫy phổ biến với xử lý unicode ...
Kính trọng, Christoph
này rất dễ dàng để làm trong Perl với 'Unicode của nó :: GCString' mô-đun, có các phương thức bao gồm các thứ tiêu chuẩn như 'length',' substr' và 'index', tất cả đều hoạt động trên đồ thị không phải là điểm mã hoặc đơn vị mã. Nó thậm chí còn bao gồm một phương thức 'cột', đặc biệt hữu ích với các ký tự rộng/đầy đủ của Đông Á và với các ký tự kết hợp và như vậy. Đây thực sự là những gì bạn muốn, và cách thức những điều này sẽ làm việc. Tuy nhiên, tôi đã không tìm thấy tương đương trong Python. Perl có hỗ trợ Unicode linh hoạt hơn và mạnh mẽ hơn Python, và rất giỏi trong chuỗi, vì vậy bạn có thể xem xét nó. – tchrist