编码问题FAQ

来源:互联网 发布:世界程序员排名 编辑:程序博客网 时间:2024/06/06 21:01

转自: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编码的网站自然就不会有乱码了。呵呵~我是这样理解的。
 UTF8是包含GB2312的,所以把GB2312转换成UTF8不会乱码,但是把UTF8转换成GB2312就有可能发生乱码了,那些在UTF8中而不在GB2312中的字符就会发生乱码!
你好版主,好像不是像你所说的那样,试验了几个GB2312编码的网站,转换成UTF-8 。转换后都是以乱码形式出现的。我也试图修改淘宝的为UTF-8 ,该网站也是以GB2312编码的  发现浏览器假死,我想这可能是由于淘宝网的“编码负重”导致的。其他几个轻量级编码为GB2312转换后都是乱码。应该如何理解呢?望回复,谢谢!
关注中,好像UTF8编码不支持汉字的,把淘宝的网站用UTF8编码的话,那些中文字就全变乱码了,
既然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包含GB2312指的是UTF-8所包含的字符库包含了GB2312的库,但它们仍是两种不同的编码方式。

而用UTF-8写的内容,用GB2312来解码,得到的自然会是乱码,反之亦然。

我是这样子理解的,不知是否正确。

那为什么我用UTF-8编码建立xml文件的时候有中文就出错了呢?

 

怎么出错了?你建立完xml保存的时候选utf-8编码方式就可以了!


原创粉丝点击