如何找出Python是用UCS-2还是UCS-4编译?

正如标题所说的那样。

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

search官方文档,我发现这个:

sys.maxunicode :为Unicode字符提供最大支持代码点的整数。 它的取决于configuration选项,该选项指定是否将Unicode字符存储为UCS-2或UCS-4。

这里不清楚的是 – 哪个值对应于UCS-2和UCS-4。

预计代码将在Python 2.6+上运行。

当用–enable-unicode = ucs4:

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

当使用–enable-unicode = ucs2:

 >>> import sys >>> print sys.maxunicode 65535 

UCS-2为0xFFFF(或65535),UCS-4为0x10FFFF(或1114111)

 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 } 

UCS-4模式下的最大字符由UTF-16中表示的最大值定义。

我曾经有过同样的问题。 我在我的维基上为自己logging

http://arcoleo.org/dsawiki/Wiki.jsp?page=Python%20UTF%20-%20UCS2%20or%20UCS4

我写了 –

 import sys sys.maxunicode > 65536 and 'UCS4' or 'UCS2' 

sysconfig会告诉pythonconfigurationvariables的unicode大小。

buildflags可以像这样查询。

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') 

另一种方法是创build一个Unicode数组,并查看itemsize:

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

引用array文档 :

'u' u'typecode对应于Python的unicode字符。 在狭窄的Unicode版本上,这是2字节,在宽版本上是4字节。

请注意,从Python 3.3开始,缩小和宽的Unicode版本之间的区别将被删除,请参阅PEP393 。 array 'u' u'typecode从3.3开始被弃用,并计划在Python 4.0中删除。

65535是UCS-2:

因此,码点U + 0000被编码为数字0,并且U + FFFF被编码为65535(hex的FFFF16)。

我遇到了同样的问题,并find一个半官方的代码,完全可以做到这一点,并可能会有相同的问题,有趣的人: https : //bitbucket.org/pypa/wheel/src/cf4e2d98ecb1f168c50a6de496959b4a10c6b122/wheel/pep425tags.py ?at = default&fileviewer = file-view-default#pep425tags.py-83:89 。

它来自wheel项目,需要检查python是否用ucs-2或ucs-4编译,因为它会改变生成的二进制文件的名称。