发布网友 发布时间:2024-10-09 05:57
共1个回答
热心网友 时间:2024-11-16 20:55
UTF,全称Unicode Transformation Format,是一种将Unicode字符集编码为二进制格式的方法,分为UTF-16、UTF-8和UTF-32三种变体。每种编码方式通过不同的码元宽度来存储字符,以适应Unicode的广泛字符集需求。UTF-16是Unicode最初的设想,最初设计为16位定长编码,但为了容纳全球所有字符,它进行了改良,采用了变长编码策略。在UTF-16中,基本平面的字符仅占用1个码元,而补充平面则需要2个码元。编码规则中,高位码元用6位表示,能够区分1024个数值,以此来标志码元是单个字符还是组合。UTF-16的编码范围可以达到10FFFF,对于超过此范围的Unicode值,会用两个码元来表示,确保每个码元至少包含10位数据。
在编码过程中,Unicode为BMP(基本多文种平面)保留了D800~DFFF(共2048个值),作为UTF-16的专用区域,这些值被分为高位代理和低位代理,用于扩展平面字符的表示。高位代理以110110开头,低位代理以110111开头,通过这种方式处理BMP之外的字符编码。
举例来说,遇到01010101 01001010(单码元)和11011000 01000000(高位代理)11011100 00000000(低位代理)的组合,会解析出不常见的汉字。Unicode码点U+20000的映射采用数学公式,通过将X-10000除以400取整再与D800和DC00组合,实现代理对的编码。
原计划采用双字节编码的Unicode,因考虑到与ASCII的兼容性,最终选择了UTF-8。UTF-8使用1到4个字节来表示Unicode,通过标识位区分字符的字节数,ASCII字符仅需1字节。它的逻辑是:最高位为0表示ASCII字符,其他情况根据标识位来解析不同数量的字节。UTF-8通过最高位区分单字节字符(1位)和多字节字符(首字节11,后续字节10),高位连续1的个数指示字符字节数,如编码的"啊"汉字,就由三个字节组成。
在存储和共享文本时,大小端问题至关重要。UTF-16和UTF-32存在大端(BE)和小端(LE)格式,分别以高位或低位在前为序。例如,UTF-16BE用FE FF表示大端,FF FE表示小端。为了避免混淆,U+FFFE已被弃用。UTF-8编码通常不使用BOM(字节顺序标记),但某些文件可能会使用EF BB BF来标记。PHP解释器在处理UTF-8 BOM时可能存在问题,如解析错误或Cookie设置失败,因此推荐PHP文件以UTF-8无BOM格式保存。对于了解字符集编码的完整旅程,可以参考以下链接: