文本文件(包括txt,html,xml,js等等后缀)的编码格式主要分为:
1.ANSI
2.Unicode
3.Unicode big endian
4.UTF-8
其中,不同编码格式的文本,根据文本的前两个字节来定义其编码格式(二进制方式打开才能看到)
ANSI: 无格式定义;
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB,第三个字节为:0xBF
以上是网上常用的说法,但实际上很多文本文件(如UE,记事本)在处理文本文件的时候,并不是单单只根据
前两个字节来决定如何解析改文本文件的。典型的我在MyElicpse里新建一个UTF-8格式的文本文件,用二进制
方式打开查看,前两个字节并不是EFBB而是实际的文本的UTF-8编码编码,如果只是按以上根据文本文件的前两
个字节来解析文件应该会解析成ANSI,但因为内部的文本实际常用的是UTF-8方式编码,结果只能是乱码。
但结果惊奇的是记事本和UE都能正确的解析,在记事本中选择另存为的时候从默认的编码格式可以看出来,
记事本是以UTF-8的形式去解析的。虽然前两个字节不是EFBB。
总结以上,个人认为。对于文本文件,如果显式地定义了文本文件后面的内容采用的编码格式,则文本处理软件
就会按照定义的方式去解析后面的内容。如果没有定义则文本处理软件(如UE,记事本)则不一定是常用ANSI去解析
而是智能的去分析文本文件采用的编码格式,试图正确的显示文件内容。
----------------------------------------------- ANSI 格式 和 UTF-8 格式的个人理解 -----------------------------------------------
在做B/S形式的系统时,写html,js等 遇到一个问题就是不同浏览器页面显示乱码的问题,就和这文件格式和ANSI编码与UTF-8
有莫大关系。写了一个html格式的文件charset 用了UTF-8格式然后,script标签导入js,结果发现在IE里面无法解析,而火狐里
中文乱码。
代码片段如下:
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/login.js"></script>
原因在于,我页面利用UTF-8编码格式去解析。然而login.js因为文本文件默认新建出来采用的是ANSI格式,问题就出来了
ANSI编码是区域相关的,例如会有这样的情况假设0001在中国会解析成‘我’这个字符,而在韩国就可能解析其它字符。
而上面代码中因为login.js采用的是ANSI浏览器就无法知道采用哪国语言去解析了,如果采用页面一样的utf-8解析那肯定乱码,
所以做法是,修改页面charset让浏览器知道用哪个国家的语言解析js文件。于是有
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<script type="text/javascript" src="js/login.js"></script>
这时候浏览器(不是太傻的话)就会采用gb2312去解析login.js就可以准确显示中文了。
另一种解决方案是显式地在script标签注明,该login.js用的是哪国的语言。如下
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/login.js" charset="gb2312"></script>
问题同样得到解决。
于是总结:个人认为UTF-8是国际化的编码,在不同国家同一个编码假设如0001不会解析成不同的字符。
而ANSI只是区域化的编码不同国家不同标准,也就是相同的编码如0001可能会被解析成不同的字符,于是就有了乱码的产生
如果乱码的是源代码则造成功能的无法实现。
------------------------------------------------------------------------------------------
以上纯属个人见解,希望各位共同讨论,指正