zoukankan      html  css  js  c++  java
  • ASCII、 Unicode 和 UTF8

    • ASCII: 英文字母与数字编号的一一对应。每个英文字母对应一个编号。范围0~127
    • Unicode: 全世界所有语言中字符与数字编号的一一对应。也即为存在的每个字符指定一个唯一的编号。范围为0~0x10FFFF。

    所以,

    ASCII与Unicode是类似的东西,都是为一个字符指定一个唯一的数字编号

    只不过Unicode的范围更大,能够表示更多的字符。

    在计算机的世界里,只有数字,而不会有什么字符。一个字符在计算机看来就是一个数字。ASCII与Unicode就是将字符与数字一一对应起来的映射。比如对于字符'A',在计算机看来,它就是一个数字65。

    当字符串被写入文件时,也是将字符串中每个字符对应的数字编号保存在文件。

    以上是ASCII和Unicode的相同点。那么,二者有什么区别?

    一个显著的区别是,对于同一段文本,二者保存到文件后占用的字节数不同。对于ASCII,每个数字编号占用一个字节。 而对于Unicode,每个编号则需要占用3个字节。因此对于同一段文本:'abcd',采用ASCII格式保存时,文件的大小为4个字节。 采用Unicode保存时,文件的大小则为12个字节。

    由此也可看出,当待保存文本为纯英文字母时,

    采用Unicode的存储效率太低了

    UTF8便是为了解决Unicode存储效率低下而产生的。具体的规则就不讲了,先来看一下UTF8能够达到的效果。

    对于相同的文本:'abcd',Unicode需要12个字节,而UTF8只需要4个字节(和ASCII一样,达到最优)。

    UTF8之所以可以用一个字节存储英文字母,是因此它使用了变长的编码方式。也即,对于英文字母,它采用一个字节保存这个字符。对于英文字母之后的字符,它采用两个字节保存这个字符。对于再之后的字符,采用三个字节保存。最多采用四个字节保存一个字符。

    所以UTF8对于存储英文字母的高效率来源于对之后字符保存效率的牺牲。这里的合理性在于:如果待保存的文本中字符大多数为英文字母,则存储效率能够提高,因为大多数字符都是采用一个字节保存。

    总结来说,

    UTF8是对Unicode在存储效率上的优化

    以上便是三者的关系。

    ASCII和Unicode都是为一个字符指定一个唯一的数字编号,Unicode能够表达更多的字符,相当于是ASCII的扩展。Unicode存在存储效率低下的问题,UTF8是在这个方面对Unicode的优化。

  • 相关阅读:
    Codeforces Round #652 (Div. 2)
    Codeforces Round #651 (Div. 2)
    The 2017 China Collegiate Programming Contest, Qinhuangdao Site
    2017中国大学生程序设计竞赛-哈尔滨站
    Codeforces Global Round 8
    [CF768D] Jon and Orbs
    2020牛客暑期多校训练营(第一场)I
    2020牛客暑期多校训练营(第一场)F
    [HDU5769] Substring
    [PA2010] Riddle
  • 原文地址:https://www.cnblogs.com/astropeak/p/9043007.html
Copyright © 2011-2022 走看看