【共读Primer】7.篇外篇----关于字符的一些事
首先在这里要感谢我们无比伟大的祖先,给了我们汉字这样牛气冲天的东西。
所以计算机里的汉语也是很有故事的,今天来和大家聊聊这些事
先从哪里说起呢?
从汉字编码说起吧,当前计算机中使用的与中文有关的编码
GB2312-80:1980年颁布的国标,
GBK:1995年颁布的国标,GB2312的一个扩展字符集,兼容GB2312的所有编码,现在汉字的主流字符集
GB18030-2000: GBK的取代版本,兼容GBK的所有字符
GB18030-2005: 以汉字为主并包含多种我国少数民族文字
BIG5:弯弯使用较多,也是弯弯企业联合制定的标准,没有简体全部为繁体字
unicode:全球统一的文字编码集
因为汉字的国标是上对下兼容的,所以我们这里主要讨论GBK、BIG5、unicode三种编码
所以从目前来说
简体中文可能字符集有两种:GBK和unicode
繁体中文可能字符集有三种:GBK、BIG5或unicode
首先来详细介绍一下三种编码:
GBK: 采用双字节(16位)表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
BIG5:常被称为大五码 双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。共收录13,060个汉字。
unicode:对于中文而言,Unicode 16编码里面已经包含了GB18030里面的所有汉字(27484个字),Unicode标准准备把康熙字典的所有汉字放入到Unicode 32bit编码中。
还有一种编码,跟汉字没有关系,但是跟计算机关系巨大ASCII编码,以上提及的所有编码方式都兼容ASCII(American Standard Code for Information Interchange 美国标准信息交换代码)编码方式
这里就要感叹一下了,类似计算机原理的这种思考方式老祖宗早就有了。
就是我们的阴阳学说,道生一、一生二、二生三、三生万物。
太极八卦图不知大家是否有仔细看过,每一卦就是三个代表阴阳的线段拼凑出来的
大胆设想,如果清朝没有闭关锁国,如果计算机诞生在中国,靠ASCII这玩意可能就不存在,现在中文就在最公共的字符编码区域里,大家都要去兼容。
并且使用中文编程,中文全球各种普及......
好了YY一下就回来吧
现在我们来看一下关于集中字符集在我们平时的变成过程中是如何让人无比闹心的
1 #include <iostream> 2 #include <string> 3 #include <fstream> 4 using std::string; 5 const int outputlen = 16; 6 7 string bytestohexstring(const char* bytes, int bytelength) 8 { 9 string str("HEX:"); 10 string str2("0123456789abcdef"); 11 for (int i = 0; i < bytelength; i++) 12 { 13 //str.append("0x"); 14 int b; 15 b = 0x0f & (bytes[i] >> 4); 16 char s1 = str2.at(b); 17 str.append(1, str2.at(b)); 18 b = 0x0f & bytes[i]; 19 str.append(1, str2.at(b)); 20 char s2 = str2.at(b); 21 str.append(" "); 22 } 23 return str; 24 } 25 26 void outputcharToValue(const char * bytes, int len, const char * msg) 27 { 28 std::cout << msg << "\nDec:" ; 29 for (int i = 0; i < len; ++i) 30 { 31 std::cout << unsigned short(bytes[i] & 0x00FF) << " "; 32 } 33 std::cout << std::endl; 34 } 35 36 void outputTheCode(const char * bytes, int len, const char * msg) 37 { 38 outputcharToValue(bytes, len, msg); 39 std::cout << bytestohexstring(bytes, len) << std::endl; 40 std::cout << "STR:"<< bytes << std::endl; 41 } 42 43 void outputCodeInFile(const char * fileName, const char * msg) 44 { 45 std::ifstream f(fileName, std::ios::in); 46 char fstr1[32] = { 0 }; 47 f.getline(fstr1, 30); 48 outputTheCode(fstr1, outputlen, msg); 49 50 } 51 52 int main() 53 { 54 55 outputCodeInFile("utf8.txt", "Load from file Code is UTF-8:"); 56 outputCodeInFile("GBK.txt", "Load from file Code is GBK:"); 57 outputCodeInFile("BIG5.txt", "Load from file Code is BIG5:"); 58 59 //system("pause"); 60 return 0; 61 } 62 63
看看这里的运行结果,乱码出现了,乱码出现了,乱码出现了....
代码运行过程中需要使用到的文件下载地址:https://download.csdn.net/download/sinjing/10579840
没有csdn积分的朋友请留下邮箱,也可以自己做,就是打出繁体的“漢字”然在不同的编码格式下保存成文件
对于结果的分析
如何得到unicode编码值:
使用word,然后先打出汉字,将光标放在汉字后面,按ALT+X 就可以在编码和汉字间转换,效果如下
其实大家在windows下编辑的代码默认是使用GBK字符集保存的。
先写到这里,欢迎大家提问讨论