欢迎来到天天文库
浏览记录
ID:9182659
大小:66.50 KB
页数:7页
时间:2018-04-20
《windows 文本文件编码-16.11.26》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
Windows文本文件编码Hanford2016年11月26日 目录目录第1章说明11ANSI编码22UTF16BE编码23UTF16LE编码24UTF-8编码25BOM36乱码37总结5I 第1章说明第1章说明如下图所示,在记事本里输入“编码”,然后另存为的时候,有四种编码:图1按下表所示,四种编码存为四个文件:编码文件名ANSIA.txtUnicodeU.txtUnicodebigendianUB.txtUTF-8U8.txt使用VC++6.0或VisualStudio以二进制方式打开这四个文件。二进制编码一目了然,如下图所示:图25 第1章说明1ANSI编码A.txt有四个字节:B1E0C2EB。其中B1E0是“编”的GBK编码,C2EB是“码”的GBK编码。所以,记事本里的ANSI编码,对于简体中文操作系统而言,就是GBK编码。对于繁体中文操作系统而言,就是Big5编码……2UTF16BE编码UB.txt有六个字节:FEFF7F167801。其中FEFF是BOM(ByteOrderMark),暂时不用管它。0x7F16是“编”的Unicode编码,0x7801是“码”的Unicode编码。UTF16BE编码是16位(2字节)的Unicode编码,BE表示bigendian,即高位字节在前,低位字节在后。Unicode编码0x7F16的高位字节是7F,低位字节是16,UTF16BE编码就是7F16。3UTF16LE编码U.txt有六个字节:FFFE167F0178。其中FFFE是BOM,暂时不用管它。0x7F16是“编”的Unicode编码,0x7801是“码”的Unicode编码。UTF16LE编码是16位(2字节)的Unicode编码,LE表示littleendian,即低位字节在前,高位字节在后。Unicode编码0x7F16的高位字节是7F,低位字节是16,UTF16LE编码就是167F。可见:UTF16LE与UTF16BE只是高低位字节交换了一下而已。4UTF-8编码U8.txt有九个字节:EFBBBFE7BC96E7A081。其中EFBBBF是BOM,暂时不用管它。E7BC96是“编”的UTF-8编码,E7A081是“码”的UTF-8编码。5 第1章说明5BOMBOM是ByteOrderMark的缩写,它用来指明编码,如下所示:BOM编码FEFFUTF16BEFFFEUTF16LEEFBBBFUTF-8上面的FEFF和FFFE正好逆序,这也就是ByteOrderMark(字节顺序标记)的来由吧。6乱码记事本通过BOM来区分各种编码,为什么不给ANSI搞个BOM?原因在于——向下兼容。从DOS到Win98,文本文件都是ANSI编码,都没有BOM。为了能够顺利的打开这些文件,不能增加BOM。通过BOM来区分各种编码,是一个非常好的想法。不过,没有历史包袱的Linux不买账——Linux默认就使用UTF-8编码,而且是没有BOM的UTF-8编码。为了能够打开Linux生成的没有BOM的UTF-8编码文件,记事本在打开没有BOM的文本文件时,会对其进行检查。如果所有编码符合UTF-8,就以UTF-8编码打开。把Error!Referencesourcenotfound.中的“编码”替换为“联通”,另存为ANSI编码。再次打开,显示如下图所示:图3使用VC++6.0打开这个文件,一切正常,如下图所示:图45 第1章说明记事本显示乱码,是因为它会把“联通”的GBK编码C1AACDA8当做UTF-8编码进行显示;VC++6.0没有显示乱码,是因为它不支持UTF-8编码,只支持ANSI编码。有哪些汉字的GBK码会被当做UTF-8编码呢?一段MFC代码就让它们原形毕露了:CFilef;if(f.Open(_T("W:\1.txt"),CFile::modeCreate|CFile::modeWrite)){f.Write(":r ",4);//这句很重要,否则记事本打开后显示乱码intq=0;//区码intw=0;//位码intc=0;BYTEn[2];//内码for(q=0x81;q<=0xFE;++q){n[0]=q;for(w=0x40;w<=0xFE;++w){n[1]=w;if(n[0]>=0xC0&&n[0]<=0xDF&&n[1]>=0x80&&n[1]<=0xBF){f.Write(n,2);if(++c>=40){c=0;f.Write("r ",2);}}}}f.Close();}运行结果如下:5 第1章说明图5这样的汉字竟然有2048个。除了“联通”还有如下常见的汉字:乾坤、学习、史实、母女、孝顺、鲁莽、矛盾、沉默、诗词、脚趾、拇指、农忙、投石、泰山、水帘、矢量、粮食、太平、谦逊、尧舜、一十百千注意:上图第一行的全角冒号很重要,就是因为它的存在,记事本才不会误判编码为UTF-8,也就不会乱码显示了。类似的字符还有很多,如下所示:,、:;“”。!……——【】■□▲△◆◇○◎●★☆←↑→↓7总结Windows下,文本文件有五种编码:ANSI、UTF16BE、UTF16LE、UTF-8有BOM、UTF-8无BOM(仅读取时支持该编码)。另存为ANSI编码时,因为没有BOM,所以有可能会被记事本、UltraEdit等文本编辑器当做无BOM的UTF-8编码,导致显示乱码。生成的文本文件除非要用于Win98,否则最好使用UTF-8编码保存。某些软件,如:AndroidStudio强制要求源代码文件使用无BOM的UTF-8编码。对于这类文件,可使用记事本查看,不要保存。否则前面三个字节的BOM(EFBBBF)删除起来还是比较麻烦的。为了方便的在这五种编码之间相互转换,可参考笔者的博文:http://blog.csdn.net/hanford/article/details/5
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处