Dan*_*ner 0 memory unicode encoding utf
据我所知,UTF-16和UTF-32之间的主要区别在于UTF-32每个字符总是四个字节,而UTF-16有时是一个字节,有时每个字符有两个字节.这使得UTF-16具有比UTF-32占用更少内存的优势,但UTF-32具有第n个字符的恒定时间访问的优点.
我的问题是,如果你能用UTF-16中最多两个字节表示每个unicode字符,那么为什么不存在总是使用两个字节来编码每个字符的格式呢?这种格式虽然比UTF-16稍贵一些内存,但通过在使用一半内存时允许恒定时间访问,将严格优于UTF-32.
我的误会是什么?
你有点不对劲:
Unicode将值(代码点)定义为0x110000,即2 21.一旦达到0x10FFFF,就需要新的编码方案,但是有大量未使用的代码点,因此在达到该限制之前,Unicode在可预见的未来有足够的空间进行扩展.
UTF-32使用32位代码单元.由于当前定义的每个代码点都小于0x10FFFF,因此每个代码点都适合1个代码单元.
UTF-16使用16位代码单元.其编码方案对于低于0x10000的代码点使用1个代码单元,对剩余代码点使用两个代码单元(称为代理对).UTF-16设计用于编码高达0x10FFFF的代码点.
UTF-8使用8位代码单元.其编码方案使用1-4个代码单元之间的任意位置来表示代码点,具体取决于其值.原始编码方案用于允许最多6个代码单元,代码点高达0x7FFFFFFF,但后来限制为4个代码单元,因此高于0x10FFFF的代码点(UTF-16中无法表示)在UTF-8中是非法的允许UTF-8和UTF-16之间的无损转换.