【问题标题】:Length of a single character encoded in UTF-32以 UTF-32 编码的单个字符的长度
【发布时间】:2018-03-15 13:07:35
【问题描述】:

Wikipedia 告诉我 UTF-32 编码使用的位数是 32 位,那为什么给我一个 64 位的长度呢?

>>> Bits(bytes = 'a'.encode('utf-32')).bin
'1111111111111110000000000000000001100001000000000000000000000000'
>>> len(Bits(bytes = 'a'.encode('utf-32')).bin)
64

UTF-32 应该是一个 4 字节的固定长度字符集,根据我的理解,每个字符在 32 位内都有固定长度表示它,但是上面代码的输出是 64。这个?

【问题讨论】:

    标签: python python-3.x unicode utf-32


    【解决方案1】:

    编码为 UTF-32 通常包含一个Byte Order Mark;您有 两个 字符编码为 UTF-32。 BOM 通常是必需的,因为它让解码器知道数据是按小端还是大端顺序编码的。 BOM 实际上只是 U+FEFF ZERO WIDTH NO-BREAK SPACE 代码点,在您的示例中被编码为 '11111111111111100000000000000000' (little-endian)。

    编码为 Python 提供的两种特定于字节序的变体之一('utf-32-le''utf-32-be')以获取单个字符:

    >>> Bits(bytes = 'a'.encode('utf-32-le')).bin
    '01100001000000000000000000000000'
    >>> len(Bits(bytes = 'a'.encode('utf-32-le')).bin)
    32
    

    -le-be 变体允许您在没有 BOM 的情况下编码或解码 UTF-32,因为您明确设置了字节顺序。

    如果您编码了多个字符,您会注意到总是比所需的字符数多 4 个字节:

    >>> len('abcd'.encode('utf-32'))  # (BOM + 4 chars) * 4 bytes == 20 bytes
    20
    

    【讨论】:

    • 那么,BOM 的长度与字符集中任意字符的位数相同吗?
    • @BeshalJaenal BOM 只是另一个代码点。所以在 UTF-32 中它编码为 32 位,就像任何其他代码点一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2014-05-09
    • 2012-07-23
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多