关于从文件中读取信息到vs在控制台输出遇到的乱码问题而引出的编码问题
作者:互联网
问题导入:
有同学让我教教他C语言的文件操作,他的要求是从文件中读取几个学生的姓名和年级信息到结构体中,我想这岂不是非常简单嘛。当场码代码给他看,结果翻车了。当文件中的姓名和年级信息都为英文的时候,表现一切良好,然后当我把姓名和年级信息改为中文时,在vs控制台上输出却发生了乱码。当时有点尴尬,这个问题我以前也碰到过,在当时也貌似解决了,而且我也知道这是编码不一致的问题,但要望具体了说,却无从下口。到底是编码哪里不一致呢?
编码问题:
众所周知,计算机只能处理数字,要想处理文本,就要将文本给转换为数字,而编码方式就是将01的数字转化为文本的桥梁。编码的方式,有很多很多种,我在此整理了最常用的几种编码方式(下面的内容我取于360百科,并作出自己的一些理解):
ascll码
ASCll是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。ascll用一个字节八位来表示一个字符,因为每个位的状态仅有0和1,因此ascll理论上可以表示256个字符。但ascll码统一将最前的一位设置为0,因此ascll码一共规定了128个字符。例如字符0对应的ascll码是112对应十六进制70对应二进制01110000.
ansi编码
最开始美国人把ascll码的0到128位中放置了所有的英文字母和一些符号和无法打印的符号,觉得应用起来绰绰有余。但随着计算机的推广,欧洲语言虽然都是字母自称,各国的字母又是各不相同,于是将128位到256位空置的位进行扩展。然后计算机到了中国,256个字符远远满足不了使用需求,就用两个字节了表示字符。称为GBK编码。到日本,日本人又用 Shift_JIS 。于是,各个国家都用这属于自己语言的编码。不管是GBK编码还是 Shift_JIS 编码,我们都称之为ANSI编码。对于ANSI编码在0x00~0x7F之间的字符,依旧是1个字节代表1个字符,这点与ascll码无异。
Unicode编码
为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。另外
UTF-8编码
然而Unicode尽管统一了编码,但它却并未指明编码该如何实现例如汉字宏的Unicode编码是:5B8F(0101 1011 1000 1111),然后我们在解码的时候如何知道这两个字节是对应的一个汉字(宏)还是两个ascll码([ 和 8F(未定义))呢?于是乎,需要一个能够实现unicode编码的编码形式。实现Unicode编码的方法有UTF-8、UTF-16、UTF-32,这里说明UTF-8.
UTF-8b编码规则
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
unicode与UFT-8转化表
| unicode (十六进制) | UTF-8 (二进制) |
| 00 00 00 - 00 00 7F | 0xxx xxxx |
| 00 00 80 - 00 07 FF | 110xxxxx 10xxxxxx |
| 00 08 00 - 00 FF FF | 1110xxxx 10xxxxxx 10xxxxxx |
| 01 00 00 - 10 FF FF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx|
问题的解决
搞明白以上几个点之后 ,我回过头了看我的那个乱码问题,首先我观察到我的记事本的编码形式是UTF-8,在UTF-8编码中 宏 对应E5AE8F,而 五 对应E4BA94.然后我又观察到我的microsoft visual studio 的控制台的代码页是 936(ANSI/OEM - 简体中文 GBK)两个的编码形式不同自然会乱码。GBK用两个字节来表示一个中文,因此我们取出宏对应的E5AE8F前两位 E5AE 转化为gb2312编码得到汉字瀹 将五 对应E4BA94 取出前两位 E4BA 得到浜,剩下的两个1位8F 94超过了7F不是ascll编码,而且只有一位也不是gb2312编码,因而查无此编码输出?。所以解决的办法是,将控制台和记事本编码方式对应,将记事本另存为编码方式为ANSI即可。
执行代码:
问题解决!
标签:编码,00,UTF,ascll,乱码,从文件,vs,Unicode,字节 来源: https://www.cnblogs.com/Ybossy/p/13023600.html