2014-09-27 20 views
8

Chuỗi Unicode được thể hiện như thế nào trong bộ nhớ của Python?Làm thế nào là unicode đại diện nội bộ trong Python?

Ví dụ: tôi có thể hình dung 'abc' làm byte ASCII tương đương trong Bộ nhớ. Integer có thể được coi là biểu diễn lời khen của 2. Tuy nhiên u'\u2049', mặc dù được thể hiện trong UTF-8'\xe2\x81\x89' - dài 3 byte, làm thế nào để tôi hình dung được mã số u'\u2049' theo nghĩa đen trong bộ nhớ?

Có cách nào được lưu trữ cụ thể trong bộ nhớ không? Python 2 và Python 3 có xử lý nó khác nhau không?

vài câu hỏi liên quan cho bất cứ ai tò mò:

1) How are these strings represented internally in Python interpreter ? I don't understand

2) What is internal representation of string in Python 3.x

Trả lời

10

Python 2 và Python 3,0-3,2 sử dụng một trong hai UCS2 * hoặc UCS4 cho các ký tự unicode, có nghĩa là nó sẽ sử dụng 2 byte hoặc 4 byte cho mỗi ký tự. Cái nào được chọn là tùy chọn biên dịch.

\u2049 sau đó được thể hiện là một trong hai \x49\x20 hoặc \x20\x49 hoặc \x49\x20\x00\x00 hoặc \x00\x00\x20\x49 tùy thuộc vào thứ tự byte có nguồn gốc của hệ thống của bạn và nếu UCS2 hoặc UCS4 được chọn. Các ký tự ASCII trong một chuỗi unicode vẫn sử dụng 2 hoặc 4 byte cho mỗi ký tự.

Python 3.3 chuyển sang một biểu diễn nội bộ mới, sử dụng biểu mẫu nhỏ gọn nhất cần thiết để đại diện cho tất cả các ký tự trong một chuỗi. Hoặc chọn 1 byte, 2 byte hoặc 4 byte. Văn bản ASCII và Latin-1 chỉ sử dụng 1 byte cho mỗi ký tự, phần còn lại của các ký tự BMP yêu cầu 2 byte và sau đó 4 byte được sử dụng.

Xem PEP-393: Flexible String Representation để biết đầy đủ mức thấp của các đại diện này.


* Về mặt kỹ thuật nói UCS-2 xây dựng sử dụng UTF-16, như các ký tự không BMP sử dụng UTF-16 người đại diện để mã hóa đến 4 byte (2 UTF-16 ký tự) mỗi. Tuy nhiên, tài liệu Python vẫn đề cập đến điều này là UCS2.

Điều này dẫn đến hành vi không mong muốn, chẳng hạn như len() đối với chuỗi unicode không phải BMP dài hơn số ký tự chứa.

+2

Để biết bạn có bản dựng "hẹp" (UCS2) hoặc "rộng" (UCS4) hay không, hãy kiểm tra sys.maxunicode. 65535 có nghĩa là hẹp, 1114111 có nghĩa là rộng. –

+0

Tôi nghĩ về mặt kỹ thuật, đó là UTF-16 hoặc UTF-32, không phải UCS2 hoặc UCS4, vì các cặp thay thế được sử dụng trong các bản dựng hẹp, biến nó thành UTF-16. –

+0

@NedBatchelder: thực sự, không chắc chắn tại sao tài liệu vẫn gắn bó với việc sử dụng UCS. –

Các vấn đề liên quan