我是专业的PHP开发人员。
请考虑以下有关 UTF-8 编码标准的文本:
UTF-8是可变长度编码。如果一个字符可以 使用单个字节表示,UTF-8会使用单个字节对其进行编码 字节。如果需要两个字节,它将使用两个字节,依此类推。它 有详细的方法来使用字节中的最高位来表示 字符组成的许多字节。这样可以节省空间,但也可以 如果这些信号位需要经常使用,则会浪费空间。
此外,请考虑以下 UTF-8 和 UTF-16 编码示例:
あUTF-8编码的字节字符串为 11100011 10000001 10000010
あUTF-16编码的字节字符串为 00110000 01000010
有人请向我解释在UTF-8编码标准和PHP上下文中字节中的最高位(或最高位)的含义。
还请向我解释字节中的这些最高位(或最高位)如何用于表示字符包含多少字节。
这种字节中的最高位(或最高位)的现象如何节省空间,但是如果这些信号位需要经常使用,也可能浪费空间?
请借助我在问题中提供的编码示例来给出答案和解释。
答案 0 :(得分:2)
此答案仅回答您在那里的(小)问题,但我确实建议您阅读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个字节,但许多字符仍将为1个字节,因此它的空间效率仍比UTF-16(后者始终为2的倍数)高作为字节数。
这意味着UTF-16需要较少的标志(16中为1位,而不是8中为1位)来指示是否会有更多的组。因此,UTF-16为字符数据移动了更多空间。这会给您的“ Japansese a”带来有趣的效果,在“ utfs-16”中也适合2个字节,而在“ utf-8”中则需要3个字节,因为使用了太多的信号位,没有空间可容纳日语(2个字节)以及所有其他字符集。
这意味着,如果您真的担心空间,可以考虑以UTF-16存储和发送主要是日语文本,而以UTF-8存储和发送主要是拉丁文本(包括英语)。实际上,我不会对此太担心,通过选择并坚持使用它可以为自己省很多麻烦。