转自:http://social.msdn.microsoft.com/Forums/zh-CN/2212/thread/f656ec85-2cd0-4d6a-a207-fe30523cc5a4/
从网站的乱码问题开始我就对编码产生了兴趣。大略的查了一下GB2312编码适合中国乃至亚洲范围浏览网站,而UTF-8编码属于国际性编码一个字符用4个编码表示,而GB2312则以2个字符表示。有人这样说过“如果是国外(欧洲地区)的用户浏览了GB2312编码的网站,会产生乱码,解决办法是安装对应编码文件。而UTF-8编码的网站则不会产生乱码。而UTF-8兼容GB2312”这句话我是记忆犹新。但总有个迷惑在里面。
我是做互联网开发的,所使用的工具是Microsoft Visual Studio 发现该工具所添加的文件大都是以默认UTF-8编码的,所以我一般开发出来的网站都是以UTF-8编码的网站。以前对这个不是太注重。
针对前人所说的解释,我做了下试验:既然UTF-8兼容GB2312的话,那么在浏览UTF-8的网站,把其中编码转化成GB2312 如图:按整理是不会出现乱码的呀,相反网站“面目全非” 这时我就对前人说的产生了迷惑,按他所说的欧洲地区浏览UTF-8编码不会有乱码,而且UTF-8包含了GB2312,而且我的浏览器这两个编码都有。请过来人帮我推敲推敲,应该怎么理解这里的“玄机”呢 :-) 在此表示感谢!
这个分体应该分开理解
对于乱码情况有两种的 一种是中文文字无法显示 说明是对应的操作系统没有安装中文字体 那么是无法显示的 一般可能会显示为一个黑色的块
一种是汉字显示不正确,说明编码不一致了,或者是编码抓换过程中转换不兼容了
还有一种就是整个页面都乱了 连标记都出现了问题
比如gb2312对英文那些字母 以及字符(256)是兼容的 但对于汉字和utf-8的不对应,需要先经过转换成unicode(utf-16) 再转换成 utf-8
不同的编码主要是在存储占用量明显不同
Utf-8使用变长的字节来保存 比如英文字母 直接一个直接就可以了 而汉字则需要更多的字节
gb2312主要是简体中文,GBK是兼容gb2312并且支持繁体中文
如果你的网页仅是汉字 那么用gb2312肯定占用的存储空间要少于 utf-8的 但对于英文的情况则是 utf-8好,英文gb2312始终是双字节的 utf-8是变长的 而且包括所有语言的字符
对于你的问题 我再补充下
浏览器接受服务器端的数据需要用某种编码来进行解码 比如浏览器发送过来的是utf-8编码 而你却要用gb2312进行解码 那么中文肯定会乱码的 但是标记却可以正常 正如我刚才所说 对于那2^7个字符 gb2312是支持的
content ="text/html; charset=UTF-8" 在我们的html标记中 这里的 utf-8就是告诉浏览器页面的字符集是utf-8
UTF-8中包含所有 gb2312 中的字符的定义 但是 每个字符的编号却不是完全对应 的 所以就会出现页面的中文字不能对应 的情况
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈! My blog~~~
这位朋友给了我一个提示,见黑体字加粗部分。参靠几位朋友的回答,自己分析了一番。感觉这个问题应该这样理解:
网站以什么什么编码指的是(源代码)就是源文件的编码是以什么来写的。之前所说的UTF-8包含GB2312编码。并不是说GB2312有“1” UTF-8就有“1”。只是说他们的明码都有“1” 可能UTF-8的编码为01,而GB2312的编码为001。当然我这是大个比方 上面的回答说“浏览器接受服务器端的数据需要用某种编码来进行解码”对是解码。根据之前的服务器传来的编码方式,用所对应的编码来解码才能正常显示需要显示的内容,而我之前的理解是用了不同于服务器端的编码形式来解码,这样当然会出现乱码了。 那么前人所说的“欧洲地区浏览了GB2312会出现乱码”当然会产生乱码了,因为他们没有该编码,正相反,他们却有国际编码UTF-8 以UTF-8编码来解释国内的UTF-8编码的网站自然就不会有乱码了。呵呵~我是这样理解的。
既然GB2312支持中文汉字,UTF8又包含GB2312的,那为什么中文变乱码呢???
同样的迷惑
对于乱码情况有两种的 一种是中文文字无法显示 说明是对应的操作系统没有安装中文字体 那么是无法显示的 一般可能会显示为一个黑色的块
一种是汉字显示不正确,说明编码不一致了,或者是编码抓换过程中转换不兼容了
还有一种就是整个页面都乱了 连标记都出现了问题
比如gb2312对英文那些字母 以及字符(256)是兼容的 但对于汉字和utf-8的不对应,需要先经过转换成unicode(utf-16) 再转换成 utf-8
不同的编码主要是在存储占用量明显不同
Utf-8使用变长的字节来保存 比如英文字母 直接一个直接就可以了 而汉字则需要更多的字节
gb2312主要是简体中文,GBK是兼容gb2312并且支持繁体中文
如果你的网页仅是汉字 那么用gb2312肯定占用的存储空间要少于 utf-8的 但对于英文的情况则是 utf-8好,英文gb2312始终是双字节的 utf-8是变长的 而且包括所有语言的字符
对于你的问题 我再补充下
浏览器接受服务器端的数据需要用某种编码来进行解码 比如浏览器发送过来的是utf-8编码 而你却要用gb2312进行解码 那么中文肯定会乱码的 但是标记却可以正常 正如我刚才所说 对于那2^7个字符 gb2312是支持的
content ="text/html; charset=UTF-8" 在我们的html标记中 这里的 utf-8就是告诉浏览器页面的字符集是utf-8
UTF-8中包含所有 gb2312 中的字符的定义 但是 每个字符的编号却不是完全对应 的 所以就会出现页面的中文字不能对应 的情况
那为什么我用UTF-8编码建立xml文件的时候有中文就出错了呢?
怎么出错了?你建立完xml保存的时候选utf-8编码方式就可以了!