Cân nhắc việc trao đổi sau đây trên IPython:Python: nhận được chiều dài chuỗi chính xác khi nó chứa cặp thay thế
In [1]: s = u'華袞與緼同歸'
In [2]: len(s)
Out[2]: 8
Kết quả chính xác nên đã 7
, nhưng vì thứ năm của bảy chữ Hán có một mã Unicode cao -point, nó được biểu diễn bằng UTF-8 bởi một "cặp thay thế", chứ không phải chỉ là một codepoint đơn giản, và kết quả là Python nghĩ rằng nó là hai ký tự chứ không phải một.
Thậm chí nếu tôi sử dụng unicodedata
, mà trả về cặp thay thế một cách chính xác như một điểm mã duy nhất (\U00026177
), khi truyền cho len()
chiều dài sai vẫn trả về:
In [3]: import unicodedata
In [4]: unicodedata.normalize('NFC', s)
Out[4]: u'\u83ef\u889e\u8207\u7dfc\U00026177\u540c\u6b78'
In [5]: len(unicodedata.normalize('NFC', s))
Out[5]: 8
Nếu không tiến hành các bước quyết liệt như biên dịch lại Python cho UTF-32, có cách nào đơn giản để có được độ dài chính xác trong các tình huống như thế này không?
Tôi đang sử dụng IPython 0.13, Python 2.7.2, Mac OS 10.8.2.
Các cuộc thảo luận [tại đây] (http://stackoverflow.com/questions/9934752/platform-specific-unicode-semantics-in-python-2-7) và [tại đây] (http://stackoverflow.com/ câu hỏi/6922480/how-to-get-a-đáng tin cậy-unicode-character-count-in-python) có vẻ có liên quan. – DSM
@DSM: Cảm ơn bạn đã đào bới. Liên kết đầu tiên của bạn cho thấy Python được biên dịch cho UTF-32 ("xây dựng rộng"), một cái gì đó tôi loại trừ trong câu hỏi của tôi. Trong lần thứ hai, câu trả lời của wberry cho thấy một đoạn mã phức tạp để thực sự đếm các ký tự thật. Cách giải quyết mặc định của tôi giống như sau, nhưng tôi hy vọng có một cái gì đó được xây dựng và trực tiếp hơn. – brannerchinese
Tôi không thể sao chép kết quả của bạn ở đây (hộp Ubuntu, python 2.7.2). Đối với unicode u '\ u83ef \ u889e \ u8207 \ u7dfc \ U00026177 \ u540c \ u6b78' Tôi có độ dài bảy với cả len (s) và len (unicode.normalize ('NFC', s)) – Vicent