字符串编码方案

字符串编码方案是个即简单又麻烦的话题,这主要涉及到字节(byte) 和字符(character) 两个不同的概念。字节是计算机软件系统的最小存储单位,我们可以用n 个字节表达一个概念,诸如4 字节的32 位整数或着其他什么对象之类的,任何对象最终都是通过字节组合来完成存储的。字符也是一种对象,它和具体的语言有关,比如在中文里, "我" 是一个字符,不能生生将其当作几个字节的拼接。 早期的计算机系统编码方案主要适应英文等字母语言体系, ASCII 编码方案的容量足以表达所有的字符,于是 每个字符占用1 个字节被固定下来,这也造成了一定程度上的误解,将字符和字节等同起来。要知道,这个世界上并非只有英文一种字符,中文等东亚语言体系的字符数量就无法用ASCII 容纳,人们只好用2 个或者更多的字节来表达一个字符,于是就有了gb2312、big5 等等种类繁多且互不兼容的编码方案。 随着计算机技术在世界范围内的广泛使用,国际化需求越发重要,以往的字符编码方案已经不适应现代软件开发。于是国际标谁化组织(ISO) 在参考很多现有方案的基础上统一制定了一种可以容纳世界上所有文字和符号的字符编码方案,这就是Unicode 编码方案。 Unicode 使得我们在一个系统中可以同时处理和显示不同国家的文字。 Unicode本质上就是通过特定的算法将不同国家不同语⾔言的字符都映射到数字上。比如中文字符"我" 对应的数字是25105 (\u6211)。Unicode 字符集(UCS, Unicode Character Set) 有UCS-2、UCS-4 两种标准。其中UCS-2 最多可以表达U+FFFF 个字符。而UCS-4则使用4字节编码,首位固定为0,也就是说最多可以有2^31个字符,几乎容纳了全世界所有的字符。 Unicode 只是将字符和数字建立了映射关系,但对于计算机而言,要存储和操作任何数据,都得用字节来表示,这其中还涉及到不同计算机架构的大小端问题(Big Endian, Little Endian)。于是有了几种将Unicode 字符数字转换成字节的方法: Unicode 字符集转换格式(UCS Transformation Format),缩写UTF。 目前常用的UTF 格式有:
  • UTF-8: 1 到4 字节不等长方案,西文字符通常只用一个字节,而东亚字符(CJK) 则需要三个字节。
  • UTF-16: 用2 字节⽆无符号整数存储Unicode 字符,与UCS-2 对应,适合处理中⽂文。
  •  UTF-32: 用4 字节⽆无符号整数存储Unicode 字符。与UCS-4 对应,多数时候有点浪费内存空间。
UTF-8 具有非常良好的平台适应性和交互能力,因此已经成为很多操作系统平台的默认存储编码方案。而UTF-16 因为等长,浪费空间较少,拥有更好的处理性能,包括.NET、JVM 等都使用2 字节的Unicode Char。另外,按照大小端划分, UTF 又有BE 和LE 两种格式,比如UTF-16BE、UTF-16LE 等。为了让系统能自动识别出BE 和LE,通常在字符串头部添加BOM 信息,"FE FF" 表示BE,"FF FE" 表示LE。后⾯面还会有⼀一两个字符用来表示UTF-8 或UTF-32。 感谢雨痕的GO语言笔记。

转载于:https://my.oschina.net/itfanr/blog/358382

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值