c++转码基础(1):各种编码类型及unicode和uft-8互转

本文介绍了字符编码的基础知识,包括ASCII、DBCS字符集以及Unicode和UTF-8编码。讨论了Unicode为解决地区性编码冲突而提出,以及UTF-8作为Unicode的实现方式在网络传输中的优势。此外,还探讨了大小端问题、Base64编码,并提供了多字符与双字符的转码函数示例。
摘要由CSDN通过智能技术生成

什么是Ascii编码?

单字节编码,适用于所有拉丁文字字母.

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符.

标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;

     通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。

     它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响

32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

扩展ASCII 字符是从128 到255(0x80-0xff)的字符.扩展ASCII不再是国际标准

 

什么是DBCS字符集?unicode的由来

 中文常用的字符集有GB2312-80,GBK(大陆的中文字符集),Big5(台湾的倚天汉字系统),unicode.

为了解决中国、日本和韩国的象形文字符和ASCII的某种兼容性,开发出双字节字符集(DBCS:double-byte character set)。

DBCS从256代码开始,就像ASCII一样。较高的128个代码中的某些总是跟随着第二个字节。这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。

为了解决中文字符的应用,中国定义了一套GB2312的字符集:

  字符集规定:127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,

  前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。

  在这些编码里,我们还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,

  这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312“。GB2312 是对 ASCII 的中文扩展。

  但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。

  后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字 符集里的内容。

  结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。

  从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 “DBCS“(Double Byte Charecter Set 双字节字符集)

后来因为很多地区都定义自己的编码字符集合,而且都是重叠的,所以在跨区域通讯向出现了问题. ISO (国际标谁化组织)为了解决这个问题,废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“。

 

unicode编码的形式?UTF-8的由来?

 unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,

 对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。

 由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在 保存英文文本时会多浪费一倍的空间。

如以下字符编码的unicode 编码(UCS-2):

字符     十六进制编码         二进制编码

I          0049               00000000 01001001

t          0074               00000000 01110100

'          0027               00000000 00100111

s          0073               00000000 01110011

           0020               00000000 00100000        

        77e5               01110111 11100101

        4e4e               01001110 01001110

        65e5               01100101 11100101

        62a5               01100010 10100101

 

unicode很长一段时间无法推广的原因有两个:

 1. unicode 是双字符编码,在网络传输和不同机器上存在大小端的问题;相同的字符集在不同的位置存在几码顺序不同。

 2. unicode 1~127的文字符浪费一个字节的空间

为了解决unicode在网络上传输的问题,出现了面向传输的UTF(UCS Transfer Format)标准,UTF-8就是每次8位传输数据,UTF-16就是每次16位数据(先有的UTF-16,但是和unicode一样的问题)。

UTF-8就是在互联网上使用最广的一种u

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值