你懂 “锟斤拷烫烫烫“ 吗

  以下摘自B站用户:林粒粒呀:你懂乱码吗
  1963 年 ANSI(美国国家标准学会)推出了 ASCII,ASCII 支持 0-9 的阿拉伯数字,小写英文字母,大写英文字母、常用的英文字符以及控制字符(NUL、SOH、ETX、EOT、BS、ESC、sp…)。每个字符都有对应的数字叫做码点(0-127)。由于计算机使用 8bit 为基本单位进行读写的,因此 ASCII 码点都会在前面补 0 ,比如大写字母 A 对应的码点是 65(二进制 1000001),在计算机读写时就会在二进制格式前补 0,即 01000001。
   Ascll 看起来非常的完善,英文环境下几乎无障碍了,但对于中文,平片假名、阿拉伯文等其他文字均无法表示,因此各国都在发展自己的编码格式。
   在 1981 年中国大陆就推出了 GB2312 编码格式,同期香港推出了 BIG5 码。GB2312 支持了中文编码,后来中国大陆对GB2312 扩展推出了 GBK 编码格式,现在在很多编码器里面都可以找到 GBK 编码格式,其优点是收录了简繁体字、日文、韩文等,做到了国际间交流无障碍。
  但由于各国都有自己的编码格式,比如中国大陆的朋友使用 GBK 给他香港的朋友发送消息“兄弟,最近好吗?”,香港的朋友的解码格式使用了 BIG5 码,打开这条信息的结果就是一堆狗屁不通的文字,俗称乱码。编码格式的不统一造成了地域与地域之间无法通信。
  在 1991 年,unicode.推出了 UTF-32 编码格式,结束了编码不统一造成的乱码现象,到目前为止其收录了超过 14 万个字符,包括平片假名、中文、阿拉伯文、藏文、古象形文字等。在 2010 年的时候,我们熟知到现在还在用的 emoji 也被收纳仅此字符集中。UTF-32 从名字就可以看出在此字符集中的每个字符都占用 32bit,比如之前的 ASCII 中的 A( 01000001),到了 UTF-32 字符集里面就会变成 00000000 00000000 00000000 01000001,表示同一个英文字符 UTF-32 需要付出四倍存储空间的代价,让英文语言国家在 UTF-32 字符集中讨不到任何一点好处。使用中文也同样讨不到好处,我们直到一个中文字符只需要 2个字节就能够表示,但在 UTF-32 里面需要 4 个字节,多余的存储空间全部放0了,这造成了极大的资源浪费。
  1992 年拯救苍生的 UTF-8 编码格式被推出了,针对 UTF-32,UTF-8 使用可变长读字符编码格式,比如 0-127 的码点字符就可以用 0xxxxx,这种格式完全兼容了 ASCII 编码格式,相比于 UTF-32 的4 四字节存储,UTF-8 储存利用率提高了4倍。其全编码格式如下:
  码点              编码
  0-127            0xxxxx
  128-2047          110xxxxx 10xxxxxx
  2048-65535         1110xxxx 10xxxxxx 10xxxxxx
  65536-1114111        11110xxx 10xxxxx 10xxxxxx 10xxxxxx
  这种编码格式既统一了各国编码格式不一样的问题,也解决了存储空间浪费的问题。
推荐使用 UTF-8 编码格式。

你可能感兴趣的:(面经笔试,字符串,经验分享,面试,c语言,数据结构)