1. 城镇大全网
  2. 综合百科

c语言中字符串的各种指令(C深入理解编程中的字符编码)

所谓字符编码方案,就是把要编码的符号按顺序编号,统一用一个序号表示。当然,编码时会适当考虑分类原则,即尽量把同类字符放在一起,以相同的二进制开头。比如ASCII的a-b分别对应十进制序列号:97-122,97的二进制是0110001。

对于字符的数据表示,使用编码方案(字符用序列号编码),对于字符的输出,通常用点阵图形输出。对于输入,英文比较简单,按键盘就可以输入,而中文不能直接用编码方案的序号来输入,因为不够直观,不方便记忆和操作。因此,出现了不同的输入方案,如吴彼和拼音。储物呢?简单的方法当然是存储编码所需的最大字节数(序列号),但是对于需要多个字节的编码方案,前面部分存储编码(序列号)显然不需要最大字节数,所以对于多字节编码方案,往往会按照一定的规则创建另一套存储方案,然后根据规则进行适当的转换。这是一种随时间变化空的做法。

1 ASCII

因为计算机最早是美国人发明的,而且美国人用的符号比较少,一个字节(8位,0-11111111)就够了。这是ASCII码,包括大小英文字母,数字,还有一些可打印或不可打印的符号,总共128:

2 GB2312

中国使用的汉字有几万个,常用汉字也有几千个。一个字节远远不够。(两个16位字节(0x0-0xffff)理论上可以表示2 ^ 16 = 65536个字符。)编码需要兼容ASCII,易于使用。

2.1兼容ASCII。

2.2将我们添加的字节映射为两个大于127的字节(确保两个字节的最高有效位都是1);

2.3如果发现最高位是0,那么就可以确定这个字节映射到ASCII字符,那么就只读取一个字节,然后查找ASCII表,解析成ASCII表对应的字符。如果发现最高位是1,则可以确定该字节映射到GB2312的字符。然后连续读取两个字节,再查GB2312,然后解析成对应的字符。

2.4 ASCII重映射ASCII的两个字节,称为全角字符,而自身ASCII的一个字节映射的字符称为半角字符。

2.5之后加入了一些字符形成GBK,然后加入了一些字符形成GB18030,都是向前兼容的。

2.6 ANSI在不同的操作系统中对应不同的字符码,比如简体中文操作系统对应GB2312,繁体对应Big5,日文操作系统对应JIS。

GB 2312标准包含6763个汉字,其中一级汉字3755个,二级汉字3008个。同时,GB 2312包含拉丁字母、希腊字母、日语平假名和片假名字母、俄语西里尔字母等682个全角字符。

GB 2312的出现基本满足了计算机处理汉字的需要,其汉字已经覆盖了中国大陆99.75%的使用频率。

GB 2312无法处理姓名和古文中的生僻字,导致了GBK和GB 18030汉字字符集的出现。

GB 2312以代码0xA1A0开头(10100001 10100000):

3 unicode

如果每个国家都有自己的一套字符编码方案,自然会给信息交流带来不便。因此,国际标准化组织制定了统一的unicode字符编码方案,尽可能地包含所有国家使用的字符。

UCS-2用2字节编码,UCS-4用4字节编码(0x0-0xffffffff)(理论上2 ^ 32 = 4294967296)。

unicode本身只指定对应的二进制数(也是序列号)。因为需要更多的比特,所以发现有些预编码的序列号只需要一个字节或者两个字节。如果同样使用四个字节,会造成空之间的浪费,所以可以考虑另一种经济的存储方案。所以在unicode统一数字编码的基础上,开发了一套存储的编码方案,就是utf,在空之间,或者空之间交换时间,或者折中,对应utf-8,utf-32,utf-16,因为存储的是另一套编码体系,需要重新转换。转换格式为:

utf-8

不同的编码段用不同的字节数(1-6)存储,一位用0交换,两位段从110和10开始,三位段从1110和10,10开始,四位段从11110和10,10,10开始。这样编码在存储前面的字符时就节省了空,是用时间换取空的折中方案。

utf-16

两个字节或四个字节用于存储,分为两段。第一段不经转换直接存储,使用两个字节。如果属于第二段(高段),第一个和第二个字节以110110开头,第三个和第四个字节以110111开头,其余用unicode编码依次填充。

utf-32:固定长度,4个字节存储,用空改变时间(因为不需要转换)。

4 C 使用的字符串

在C中,char用来表示单字节字符,wchar_t用来表示宽字符,这为国际代码提供了一些支持。Char * strings由特殊的封装类std::string处理,标准的iostream是std::cin和std::cout。对于wchar_t * string,封装类是std::wstring,标准iostream是wcin和wcout。虽然指定了宽字符,但是不清楚宽字符占用多少字节。Windows系统中的宽字符是两个字节,是UTF-16;。在Unix/Linux系统中,为了更全面的国际编码支持,其宽字符为四个字节,即UTF-32编码。这给程序的跨平台带来了一些困惑。除了Windows程序开发中常用wchar_t* string表示UTF-16,其他情况下很少使用wchar_t*。MFC通常用自己的TCHAR和CString类支持国际化。未定义_UNICODE宏时,TCHAR = char,定义_UNICODE宏时,TCHAR = wchar_t,CString内部类似。Qt使用QChar和QString类(内部常量为UTF-16),一般图形开发库使用自己的字符串类库。在新标准C 11中,明确定义了对国际代码的支持:

char *对应UTF-8编码字符串(代码表示为u8 & # 34多种语言& # 34;),封装类是STD::string;;

添加 char16_t *对应UTF-16编码字符串(代码表示为u & # 34多种语言& # 34;),封装类为STD::u 16 string;

添加 char32_t *对应UTF-32编码字符串(代码表示为U & # 34多种语言& # 34;),封装类是std::u32string。

因为Qt有打包的QString,所以不太需要这些新的字符串格式。

-End-

,

猜你喜欢:综合百科

综合百科c语言中字符串的各种指令(C深入理解编程中的字符编码)

转载请注明:原文链接 | http://www.nnxc.com.cn/10043347536.html