Unicode编码和ANSI编码

之前一直对Unicode、ANSI、ASCII、UTF-8、string、wstring的概念混淆不清,今天特地查询资料整理下。

ANSI编码

ANSI编码和Unicode编码都是字符代码的一种表现形式。也就是一个字符既可以编码ANSI也可以编码成Unicode,只是表现形式不一样罢了。

首先来看下ANSI的全称:American National Standard Institute,美国国家标准协会。

虽然名字是美国的,但是不同国家和地区制定了相应不同的标准,由此产生了GB2312、GBK(简体中文的ANSI编码)、Big5、Shift_JIS(日文的ANSI编码)等各自的编码标准,这些使用1~4个字节来代表一个字符的各种外文字符延伸编码方式,称为ANSI编码。可以看出不同的ANSI码相互之间并不兼容,无法将两种相同的语言的文字,存储在同一段ANSI编码的文本中。

ANSI编码的特点

对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表一个字符,而这之外的字符通常是使用0x80~0xFF范围内的两个字节来表示一个字符。比如汉字找那个的’中’在简体中文中使用[0xD6, 0xD0]这两个字节存储。

这一点是Unicode编码和ANSI编码之间最大的不同。Unicode编码都是两个字节表示一个字符。

ASCII码

由美国国家标准协会制定,全称:American Standard Code for Information Interchange,美国标准信息交换码。其使用7位二进制数共128个组合来表示所有的大写和小写字母、数字0~9、标点符号以及在美式英语中使用的特殊控制字符。

由于ASCII码字符有限,所以现在也存在扩展的ASCII码,也就是8位ASCII码。

Unicode编码

Unicode字符集编码全称:Universal Multiple-Octet Coded Character Set,通用多八位编码字符集。Unicode字符集是国际组织制定的可以容纳世界上所有文字和符号的编码方案。

Unicode编码为每个字符设定了同一并且唯一的二进制编码,以满足跨平台、跨语言进行文本转换、处理的要求。Unicode标准始终使用十六进制数字。

但是Unicode只是一个符号集,之规定了符号的二进制代码,却没有规定这个二进制代码该怎么存储。

UTF-8编码

UTF-8全称:8bit Unicode Transformation Format,8比特Unicode通用转换格式。UTF-8是一种针对Unicode的可变长度字符编码。可以表示Unicode标准中的任何一个字符,且其编码中的第一个字节仍然与ASCII兼容。

UTF-8用1~4字节对Unicode进行编码。对于0x00~0x7F之间的编码与ASCII编码完全相同。

string和wstring

basic_string

string是basic_string在char上的实例化,wstring是basic_string在wchar_t上的实例化。

char wchar_t

char是窄字符,为1个Byte,wchar_t是宽字符,在Linux上为4Bytes,在Windows上为2Bytes。

char和wchar_t是否和Unicode有关?

Linux上,string一般以UTF-8格式编码。在Linux情况下,应该使用string。

Windows上,如果应用程序使用char,这些char string将会使用本地charset/codepage上的形式显示在显示器上;如果是Unicode-based应用程序,Windows使用wchar_t——2bit宽,使用UTF-16编码。

应用程序使用char为Multibyte,因为每个glyph由一个或多个char组成;使用wchar_t为widechar,因为每个glyph由一个或两个wchar_t组成。(详情请见MultiByteToWideChar和WideCharToMultiByte API函数)

在Window上,除非使用了GTK+或者QT这样的框架,否则你应该使用wchar_t。事实上,Windows对wchar_t其作用,所以使用char的应用程序,他们的char string都会被转化为wchar_t string。

string和wstring对比

  • Linux总是使用string,而Windows上总是使用wstring,需要跨平台看toolkit
  • 待整理

博客原文地址:http://jerkwisdom.github.io/code/common/unicode-and-ansi/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值