【问题标题】:What does it mean by 'Highest Bit' or 'Highest Bits' in a byte?一个字节中的“最高位”或“最高位”是什么意思?
【发布时间】:2026-01-04 19:15:01
【问题描述】:

我是一名专业的 PHP 开发人员。

考虑以下关于 UTF-8 编码标准的文本:

UTF-8 是变长编码。如果一个字符可以 使用单个字节表示,UTF-8 将使用单个字节对其进行编码 字节。如果它需要两个字节,它将使用两个字节,依此类推。它 有详细的方法来使用字节中的最高位来表示如何 一个字符由许多字节组成。这可以节省空间,但也可以 如果需要经常使用这些信号位,则会浪费空间。

另外,请考虑以下 UTF-8UTF-16 编码示例:

あ UTF-8 编码的字节串是 11100011 10000001 10000010

あ UTF-16 编码的字节串是 00110000 01000010

请有人解释一下在 UTF-8 编码标准和 PHP 的上下文中术语最高位(或最高位)在一个字节中的含义。

另外,向我解释一下这些字节中的最高位(或最高位)是如何用来表示一个字符由多少个字节组成的。

这种最高位(或最高位)在一个字节中的现象如何可以节省空间,但如果这些信号位需要经常使用,也可能浪费空间?

请借助我在问题中提供的编码示例给出您的答案和解释。

【问题讨论】:

标签: php unicode utf-8 character-encoding utf-16


【解决方案1】:

这个答案只是回答了你的(小)问题,但我真的建议你阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 以了解更广泛的情况。 它已有 15 年历史,但基本内容没有改变,它很好地解释了背景、技术和背后的历史。这肯定有助于解释您在使用 unicode 进行 Web 开发时在实践中遇到的某些问题,并且它将帮助您设置好的测试用例,因此您的软件不会在使用法语时突然崩溃或日本人开始使用它。毕竟,如果你开始使用 unicode,你必须从数据库到 charset 标头一路正确。

也就是说……

高位

最高位是通常写在左侧的位,代表值的最高部分。就像你写 1857824 时一样,1 是最高位,(代表一百万)。对于二进制,它是相同的,除了这些数字总是只有 0 或 1。

信号位

在 unicode 中,它不是使用所有位来表示字符的值(一个字节中允许 256 个不同的字符),而是使用较少的位并使用一些位来表示下一个字节包含更多关于相同的信息特点。这些信号位在“高”侧(在前面)。

适合 2 或 3 个字节的字符

如果您只有英文文本,在 UTF-8 中每个字符仍将适合单个字节,并且信号位将指示没有第二个字符。如果你不时将它与带有变音符号的拉丁字符混合,一些字符将是 2 个字节,但许多仍然是一个字节,因此它仍然比 UTF-16 更节省空间,UTF-16 始终是 2 的倍数作为字节数。

这意味着 UTF-16 需要更少的标志(16 位中的 1 位,而不是 8 位中的 1 位)来指示是否会有更多组。因此 UTF-16 为字符数据移动了更多空间。这会为您的“Japansese a”产生有趣的效果,它也适合 UTF-16 中的 2 个字节,而在 UTF-8 中,您需要 3 个字节,因为使用了太多的信号位,并且没有空间可以容纳2 个字节的日语以及所有其他字符集。

这意味着,如果您真的担心空间问题,您可以考虑以 UTF-16 存储和发送主要是日语文本,同时以 UTF-8 存储和发送主要是拉丁语文本(包括英语)。实际上,我不会太担心这一点,并且通过选择并坚持它来为自己省去很多麻烦。

【讨论】:

    最近更新 更多