【问题标题】:How to find out if Python is compiled with UCS-2 or UCS-4?如何确定 Python 是使用 UCS-2 还是 UCS-4 编译的?
【发布时间】:2010-11-29 14:26:18
【问题描述】:

正如标题所说的那样。

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

查了官方文档,发现是这样的:

sys.maxunicode:一个整数 支持的最大代码点 Unicode 字符。这个的价值 取决于配置选项 指定是否为 Unicode 字符存储为 UCS-2 或 UCS-4。

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

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

【问题讨论】:

    标签: python unicode ucs2


    【解决方案1】:

    使用 --enable-unicode=ucs4 构建时:

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

    使用 --enable-unicode=ucs2 构建时:

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

    【讨论】:

    • 对于 Python 3,这不再是普遍正确的。请参阅 docs.python.org/3.4/c-api/unicode.html: Since the implementation of PEP 393 in Python 3.3, Unicode objects internally use a variety of representationspython.org/dev/peps/pep-0393
    • @Jan-PhilipGehrcke: deficient_unicode_build = (sys.maxunicode < 0x10ffff) 适用于任何 Python 版本(即使在 sys.maxunicode == 0x10ffff 处使用了灵活的内部表示)。灵活的表示可以像 ucs4 在以前的版本上一样获得正确的结果,同时在某些情况下使用的内存比 ucs4 少。
    【解决方案2】:

    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 可表示的最大值定义。

    【讨论】:

    • 请注意,此函数用于在 python 3.3 之后实现 sys.maxunicode(即,截至本评论的所有 python 维护版本) - 它只涉及大小现在已弃用的Py_UNICODE typedef。 maxunicode 源自 SET_SYS_FROM_STRING("maxunicode", PyLong_FromLong(0x10FFFF));
    【解决方案3】:

    我曾经遇到过同样的问题。我在我的 wiki 上为自己记录了它在

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

    我写了-

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

    【讨论】:

    • 对于任何想知道这是做什么的人:这是一种旧的 ('UCS4' if sys.maxunicode > 65536 else 'UCS2'。
    【解决方案4】:

    sysconfig会根据python的配置变量告诉unicode大小。

    可以像这样查询构建标志。

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

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,并找到了一段半官方的代码,它完全可以做到这一点,并且可能对遇到同样问题的人来说很有趣: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编译的,因为它会改变生成的二进制文件的名称。

      【讨论】:

        【解决方案6】:

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

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

        引用自array docs

        'u' 类型码对应 Python 的 unicode 字符。在窄 Unicode 版本上,这是 2 字节,在宽版本上,这是 4 字节。

        请注意,窄 Unicode 构建和宽 Unicode 构建之间的区别从 Python 3.3 开始被删除,请参阅PEP393array'u' 类型代码自 3.3 起已弃用,并计划在 Python 4.0 中删除。

        【讨论】:

          【解决方案7】:
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2012-02-18
          • 2011-10-21
          相关资源
          最近更新 更多