2009-09-18 28 views
55

Chỉ tiêu đề cho biết.Cách tìm hiểu xem Python có được biên dịch bằng UCS-2 hay UCS-4 không?

$ ./configure --help | grep -i ucs 
    --enable-unicode[=ucs[24]] 

Tìm kiếm các tài liệu chính thức, tôi thấy điều này:

sys.maxunicode: Một số nguyên đưa ra các điểm mã được hỗ trợ lớn nhất cho một nhân vật Unicode. Giá trị của số tùy thuộc vào tùy chọn cấu hình chỉ định xem Unicode ký tự được lưu trữ dưới dạng UCS-2 hoặc UCS-4 hay không.

Điều không rõ ràng ở đây là - (các) giá trị tương ứng với UCS-2 và UCS-4.

Mã được dự kiến ​​sẽ hoạt động trên Python 2.6+.

Trả lời

101

Khi xây dựng với enable-unicode = ucs4:

>>> import sys 
>>> print sys.maxunicode 
1114111 

Khi xây dựng với enable-unicode = UCS2:

>>> import sys 
>>> print sys.maxunicode 
65535 
+2

Điều này không còn phổ biến nữa cho Python 3. Xem https://docs.python.org/3.4/c-api/unicode.html: 'Vì việc triển khai PEP 393 trong Python 3.3, các đối tượng Unicode sử dụng nội bộ một nhiều đại diện'. https://www.python.org/dev/peps/pep-0393/ –

+2

@ Jan-PhilipGehrcke: 'deficient_unicode_build = (sys.maxunicode <0x10ffff)' hoạt động trên bất kỳ phiên bản Python nào (ngay cả khi biểu diễn bên trong linh hoạt được sử dụng ở đâu 'sys.maxunicode == 0x10ffff'). Các biểu diễn linh hoạt cho phép nhận được các kết quả chính xác như ucs4 đã làm trên các phiên bản trước đó trong khi sử dụng ít bộ nhớ hơn ucs4 trong một số trường hợp. – jfs

18

Đó là 0xFFFF (hoặc 65535) cho UCS-2, và 0x10FFFF (hoặc 1.114.111) cho UCS-4:

Py_UNICODE 
PyUnicode_GetMax(void) 
{ 
#ifdef Py_UNICODE_WIDE 
    return 0x10FFFF; 
#else 
    /* This is actually an illegal character, so it should 
     not be passed to unichr. */ 
    return 0xFFFF; 
#endif 
} 

Ký tự tối đa trong chế độ UCS-4 được xác định bởi giá trị tối đa thể hiện trong UTF-16.

4

sysconfig sẽ cho kích thước unicode từ các biến cấu hình của python.

Có thể truy vấn buildflags như thế này.

Python 2.7:

import sysconfig 
sysconfig.get_config_var('Py_UNICODE_SIZE') 

Python 2.6:

import distutils 
distutils.sysconfig.get_config_var('Py_UNICODE_SIZE') 
1

tôi đã cùng một vấn đề và tìm thấy một mảnh bán chính thức của mã mà không chính xác điều đó và có thể thú vị cho những người có cùng vấn đề: https://bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425tags.py?at=default&fileviewer=file-view-default#pep425tags.py-83:89.

Nó xuất phát từ dự án bánh xe cần kiểm tra xem trăn được biên dịch với ucs-2 hay ucs-4 vì nó sẽ thay đổi tên của tệp nhị phân được tạo ra.

1

Một cách khác là tạo ra một mảng Unicode và nhìn vào itemsize:

import array 
bytes_per_char = array.array('u').itemsize 

Trích từ array docs:

Các 'u' typecode tương ứng với ký tự unicode của Python. Khi xây dựng Unicode hẹp, đây là 2 byte, trên các bản dựng rộng, đây là 4 byte.

Lưu ý rằng sự khác biệt giữa các bản dựng Unicode hẹp và rộng được giảm từ Python 3.3 trở đi, xem PEP393. Mã lỗi 'u' cho array không được dùng nữa kể từ 3.3 và được lên lịch để xóa trong Python 4.0.

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