博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序员永远的痛,字符编码的奥秘
阅读量:4165 次
发布时间:2019-05-26

本文共 1235 字,大约阅读时间需要 4 分钟。

字符编码相信是每个程序员的噩梦,只要是有中文的地方,总是会遇到各种编码的问题,并且这种问题还非常难缠,尤其在linux上,因为上面很多软件都是针对 英语国家开发的,是不会考虑其他语种编码问题。在遇到编码的无数大坑之后,我决定仔细研究下编码问题,因为这就像一道坎一直横在你面前,每次到这里你都会 跌到,每次爬起来之后,你都若无其事,这样的人被称作战士,真正的战士。可惜是个力量战士,做为新时代的智力战士,当然不能在那跌到然后又在这继续跌到。

     文件的存储方式:
     文件都有自己的存储格式,比如最常见的txt,cpp,h,c,xml ,png, rmvb各种格式,还有自定义格式。这些文件不论是什么格式,都是存储在计算机硬盘里的2进制格存储,对应不同文件格式,有不同的软件解析。这篇文章不谈 文件是如何存储的,只谈文件是如何解析的。
     文本文件解析:
     文本文件对应于人类可以阅读的文本,如何从2进制转换为文本文件呢?起初由于计算机在美国发明,自然大家考虑的是英语如何表示,英语字母总共26个,加 上特殊字符,128个字符,7位既一个byte即可表示出来。这个就是大家所熟知的ascill编码。对应关系很简单,一个字符对应一一个byte。
     但很快发现,其他非英语国家的文字远远超过ascill码,这时候大家当然想统一字符编码,不同国家出了自己不同的编码方式,中国的gb2312就是自 己做出来的编码方式,这样下去每个国家都有自己的编码方式,来回转换太麻烦了。这时候出现了新的编码方式,unicode编码方式,想将编码统一,所以规 定了每个字符对应的unicode码。
     1、很多文件都是ascii编码,如果用unicode 太浪费。
     2、没有标志位说明该几个字节来解析为一个符号。
     这时候拯救世界的utf出现了,utf是unicode的一种实现,只不过更聪明了。utf16是占用两字节,或者四字节,utf32是占用四字节。utf8是很聪明的一种表示方式。
     1、对于单字节符号,字节第一位为0,后面7位表示字节编码。
     2、对于n字节符号,第一字节的前n位都设为1,第n+1位为0,其余位为编码位置。
对于不同的编码,在文本的最前方有不同的标志,unicode 通常有两位来表示分别是ff fe, 或者feff, fffe表示big-endian 编码feff表示litte-endian编码。
utf8是efbbbf来开头的。可以看出来utf-8是自解释的,所以不用带这个标志文件,大多数程序 是可以识别的。但有些程序不能识别这个标志,比如php就会直接把这个标志当文本解析,不会忽略。相信很多遇到php输出文本解析乱码或者解析错误的同学 都遇到这样的问题。
    如何解决问题:
    如果有vim那最好不过了,去掉命令:
    set encoding=utf-8
    set nobomb
    添加命令:
    set encoding=utf-8
    set bomb
   或者使用notepad++自带的功能
转载:
你可能感兴趣的文章
利用word2010+直接发布到csdn
查看>>
在CSDN上发布视频blog
查看>>
linuxC语言按行存入txt文件,按行读取txt文件
查看>>
#undef的用法
查看>>
VS2010调试时如何把调试信息写入日志
查看>>
strtol函數的用法
查看>>
指针作为函数的出入参数例子说明
查看>>
C语言atoi()函数:将字符串转换成int(整数) 会自动把里面的非数字抛出 转换是数字的
查看>>
查看目录占用空间du -sh和磁盘df 区别
查看>>
C语言popen()函数:建立管道I/O 通过POPEN来执行cat 或 du -sh 等相关linux命令
查看>>
C语言实现查看一个文件夹目录里面所有内容的大小功能
查看>>
脚本 终端一起来时运行的命令
查看>>
c/c++ strrchr函数用法 查找字符串最后一次出现的位置
查看>>
atof跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换
查看>>
c语言中包含math.h的时用gcc编译要加-lm参数
查看>>
编译错误:error: expected '=', ',', ';', 'asm' or '__attribute__' before...
查看>>
在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是
查看>>
关于int类型数据在内存中的高低位存储问题
查看>>
如何判断变量在内存中如何放置的?低位在前还是高位在前
查看>>
c语言中通过指针将数值赋值到制定内存地址
查看>>