Unicode编码和ANSI编码

(3) 2024-05-19 13:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说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/

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复