`
iwebcode
  • 浏览: 2004394 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

<分享>告别乱码 – 网站编码问题汇总

 
阅读更多

<分享>告别乱码 – 网站编码问题汇总

相信各位同行或多或少都会碰到过乱码的问题。
从来没有?相信我,只是时候未到,在这行混,迟早会碰到的。
当然,如果你对各类编码非常了解,对浏览器脾气摸得很清楚了,你可以避开或者快速解决此类问题。
希望这篇文章对你有所帮助。

一、为什么会出现乱码?
在计算机中,我们储存的信息都是用二进制码表示的。我们文字和符号用的二进制代码的互相转换,就是编码,转换需要一种规则,就是字符集(charset),我们常用的字符集例如:ascii,gb2312,unicode。
不同的字符集所存储的内容不同, 比如“太平洋”三个字采用gb2312对应的值为4411 3829 4983,utf-8对应为E5 A4 AA E5 B9 B3 E6 B4 8B,这样,当一个gb2312的文件嵌入一个utf-8的文件的时候,问题就来了。

二、ANSI, Unicode, UTF-8, Encode, Charset, HTML实体… 我快疯了
疯完了没,没昏就行了,别着急,听我一一道来。其实这只是同一样东西在不同场合的应用。
A. ANSI, Unicode, UTF-8
这几个归为一类,它们是文件编码。
ANSI指当地编码,比如在大陆它指GB2312,在台湾它指GBK(Win中记事本保存文件的时候的默认选项就是它)。
Unicode是一个通用字符集,它是一个编码标准,这个和GB2312是对应的,但因为字符集过大,Unicode有它的特殊性,在不同应用场合,有不同的具体实现手法,比如应用于互联网传输,采用的存储与传送格式是UTF-8,Windows应用UTF-16,Linux 应用UTF-32。
B. Charset
HTML中的Charset,CSS中的@charset,XML中的encoding等,这几个归为一类。
它们是告诉浏览器如何解码。比如psd后缀是告诉系统这是Photoshop源文件,同样charset设为gb2312是告诉浏览器这是一个简体中文的网页。

C. Encode
Encode和encodeURI,encodeURIComponent归为一类。
这在下一节中进行比较详细的介绍。当浏览器提交数据给服务器时,特殊字符中文一般浏览器会自动编码,但存在部分保留字符,比如”# /”等,这时候需要encode等进行转换。
D. HTML实体
当网页中需要插入某些特殊字符时,需要用到HTML实体,比如插入<,可以使用<或者实体编码<。

三、Javascript URI编码/解码
A.为什么需要URI编码?
通常来说,之所以URI需要进行编码,是因为URI中有些字符可能会引起歧义或者有隐私的数据。
B. 编码与解码的函数?
JS对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent
C. 如何选择?
首先,范围不同。Escape不能编码的字符有: @ * / +;encodeURI:! @ # $& * ( ) = : / ; ? + ‘ ; encodeURIComponent:! * ( ) 。
其次,编码类型不同。encodeURI、encodeURIComponent采用utf-8进行编码;而Escape采用系统编码。
所以,怎么选择?例如内容中要存在URI标识,则用encodeURI,如果想把”#,/”也要编码用escape或encodeURIComponent。

四、Ajax加载的文件中不能用中文?
这一直是让开发人员很头疼的问题之一,也是常见的编码问题,原因很简单,你非得拿羊城通往ATM上插,结果当然是读不出来或者读错。编码问题也是一样,通常出错的情况是,文档编码是GB2312,而浏览器以UTF-8(Ajax默认解码方式)来解码,自然乱码。
怎么解决呢?
1、文档采用UTF-8编码,不会产生任何问题。
2、如果不能用UTF-8,XML文档可以指定它的Encoding,JS文件和JSON数据目前没有好的解决办法。

五、GB2312,UTF-8都可以显示中文,如何选择?
可以显示中文的编码有GB2312、GBK、GB18030、Unicode。前三个保持向后兼容,比如“太平洋”这几个字在这几个编码规则中内码是一样的。它们的不同之处在于字符集不同,GB2312只包括简体中文,GBK还包括繁体,GB18030再加入了少数民族语言,比如藏文。那如果显示简体中文可以任意选择?据我目前测试了解,应该都是可以的,至于速度上是否有差异,还未深究,但GB2312肯定更为通用,而且据我测试已经包含了相当部分繁体。至于Unicode,应用在网页中的UTF-8,中文一般需要占据3个字节(前三种2个字节),所以当中文较多的网页用UTF-8文件将变得更大(我们公司大部分网页4%左右)。

六、UTF-8、UTF-16、UTF-32什么区别?
Unicode所做的是为每个字符定义了一个相应的数字表示。比如,“a“的Unicode值是0×0061,“一”的 Unicde值是0×4E00,这是最简单的情况,每个字符用2个字节表示。 Unicode定义了百万个以上的字符,如果将所有的字符用统一的格式表示,需要的是4个字节。“a“的Unicode表示就会变成 0×00000061,而“一“的Unicode值是0×00004E00。实际上,这就是UTF32,Linux操作系统上所使用的Unicode方案。但是,仔细分析可以发现,其实绝大部分字符只使用2个字节就可以表示了。英文的Unicode范围是0×0000-0×007F,中文的Unicode范围是0×4E00-0×9F**,真正需要扩展到4个字节来表示的字符少之又少,所以有些系统直接使用2个字节来表示Unicode。比如Windows 系统上,Unicode就是两个字节的。对于那些需要4个字节才能表示的字符,使用一种代理的手法来扩展(其实就是在低两个字节上做一个标记,表示这是一个代理,需要连接上随后的两个字节,才能组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种Unicode表示方法就是 UTF16。一般在Windows平台上,提到Unicode,那就是指UTF16了。 而UTF-8更有意思,它的字节数1-4个不等,如果纯英文的应用环境,自然用它更加节省。

七、CSS、JS的编码可以和HTML不一致吗?
可以。但最好在引用时手动设置Charset,值得注意的是IE、FF默认根据当前页面编码,而Chrome默认是UTF-8。

八、我这人比较懒,直接给点建议吧。
懒得够可以的,好吧,那我想到几条写几条:
1、框架页不受父页面编码影响;
2、关于浏览器编码纠错。
测试:创建utf-8文件,更改meta charset属性为gb2312(文件本身数据编码不变),外链gb2312的JS文件,结论:
IE&Chrome自动以utf-8解析,外链JS乱码;
FF以gb2312解析,外链JS中文显示正常。Demo: 测试自动解析编码.html
3、Ajax加载,如果目标文档文件编码非UTF-8,需指定encoding,否则中文乱码;
XML是可以指定编码的,但如果是JSON,Script之类的数据,无法指定编码,要显示中文只有用UTF-8的编码;
4、外链的js,IE、FF默认根据当前页面编码,Chrome默认是Utf-8。如果JS文件为Unicode编码,给文件加上bom比较保险(IE、FF的智能识别)
5、Get数据,IE678,ff3 GBK编码,Chrome utf-8编码。
6、想完全避免它,如果条件允许,网站前后台数据库全部统一用utf-8吧,万事大吉,想碰到编码问题都难。
全部统一用gb2312?不行,问题照出,原因在上文中。

分享到:
评论

相关推荐

    C#编程经验技巧宝典

    10&lt;br&gt;&lt;br&gt;0023 如何添加引用第3方控件 11&lt;br&gt;&lt;br&gt;0024 如何生成DLL文件 11&lt;br&gt;&lt;br&gt;0025 如何使用不安全代码 11&lt;br&gt;&lt;br&gt;第2章 语言基础 13&lt;br&gt;&lt;br&gt;2.1 注释 14&lt;br&gt;&lt;br&gt;0026 如何对代码进行注释 14&lt;br&gt;...

    swagger2生成PDF编码混乱处理.zip

    这个jar包可以用来覆盖本地maven仓库的官方jar包,以此来解决swagger2生成的PDF文档中文乱码,或者中文不全的问题。使用方法:下载下来的jar包,名字改成和官方一样的asciidoctorj-pdf-1.5.0-alpha.16.jar,然后复制...

    PHBMail v1.2.0

    &lt;br&gt;本文件采用GBK编码,所以在使用其他编码时,可能会存在乱码情况,请自行转到相应编码!&lt;br&gt;&lt;br&gt;2.用户名或密码验证出错!&lt;br&gt;如果用户名或密码处出错请按照以下措施检验:&lt;br&gt;(1)您确定你有SMTP服务的使用权&lt;br&gt;(2)您...

    曼波整站系统5.3.0

    曼波整站系统5.3.0 在 5.2.0 基础上清除了很多已知的bugs,并做了大量改进,主要表现为:&lt;br&gt;&lt;br&gt;* 中文处理功能得到很大加强,在使用 UTF-8 编码时,令人讨厌的弹出框乱码、安装美化留言板组件造成后台菜单不见等...

    jsp版鲤鱼论坛mysql4.0+tomcat.rar

    request取参数时转化编码&lt;br&gt;##&lt;br&gt;param = no&lt;br&gt;param.from=ISO-8859-1&lt;br&gt;param.to=GB2312&lt;br&gt;&lt;br&gt;# 写入数据到数据库转化编码&lt;br&gt;encode = no&lt;br&gt;encode.from=ISO-8859-1&lt;br&gt;encode.to=GB2312&lt;br&gt;&lt;br&gt;# 从数据库...

    Fire IPB[S] v1.0.4c Build 050118

    加入 IPB 2.0.3 安全更新&lt;br&gt; 新增:帖子图片缩小可以点击在新窗口打开&lt;br&gt; &lt;br&gt; &lt;br&gt; Fire IPB 论坛是 Fire IPB ...修复了 2.0.3 的部分仍然存在的问题&BUG 支持在任何编码的服务器上使用本论坛而且绝对不会有乱码问题

    SOCKET_压力测试与日志工具

    在上面文本框输入 HTTP 协议包文本,点击发送,会向服务器发送&lt;br&gt;信息,然后会在下面的文本框显示 Response,如果返回的是 UTF-8 编码,可以在菜单里选择 UTF-8 解码&lt;br&gt;从而解决乱码问题。发送有TCP/UDP/...

    曼波整站系统5.2.0

    根据语言编码指定字符集,创建表时根据语言编码指定默认字符集,有效解决乱码问题&lt;br&gt;4) 改进安装程序,在创建表时根据语言编码指定默认字符集&lt;br&gt;&lt;br&gt;&lt;br&gt;三、增加功能&lt;br&gt;&lt;br&gt;1. 增加 box_mychildhood_cn 童年风格...

    SimpleBoard汉化版

    &lt;br&gt; 修正了在属性模式下,中文字符乱码的问题(官方的还是存在的哦) &lt;br&gt; &lt;br&gt; 安装: &lt;br&gt; 1.上传到您网站的某个目录。比如说forum &lt;br&gt; 2.更改config.php文件 &lt;br&gt; 3.导入simpleboard.sql数据库(建议使用...

    eclipse struts 中文乱码问题图解

    eclipse struts 中文乱码问题图解&lt;br&gt;页面乱码&lt;br&gt;参数乱码&lt;br&gt;国际化乱码

    CCP的简单的代码生成器v0.6

    此版本主要优化和修复,并重写了大部分源码,可能还存在不少BUG也请大家有空帮忙测试下...&lt;br&gt; 修正了生成中文可能乱码问题。&lt;br&gt; 修正了程序配置无法保存的问题&lt;br&gt; 更改了配置保存方式。&lt;br&gt; &lt;br&gt;发布日期:2008-1-5

    GamVan Club v3.0 beta 2

    &lt;br&gt; 6.UTF-8编码,解决贴繁体或国外字符乱码问题。 &lt;br&gt; 7.CSS控制整个社区颜色及风格。 &lt;br&gt; 8.版面多种可选属性,让社区变得更灵活。 &lt;br&gt; v3.0 Beta 2更新内容: &lt;br&gt; 1. 完成好友列表添加删除等功能。 &lt;br&gt; 2....

    Fire IPBS v1.0.4b Build 050105

    支持在任何编码的服务器上使用本论坛而且绝对不会有乱码问题&lt;br&gt; v1.0.4b Build 050105&lt;br&gt; &lt;br&gt; 修正语言包 Blog 部分的汉化错误&lt;br&gt; 修正后台 Blog 部分的汉化错误&lt;br&gt; 修正发贴页面没有汉化完全的情况&lt;br&gt; 修正...

    GVclub v1.1

    &lt;br&gt; 6.UTF-8编码,解决贴繁体或国外字符乱码问题。&lt;br&gt; 7.CSS控制整个社区颜色及风格。&lt;br&gt; 8.版面多种可选属性,让社区变得更灵活。&lt;br&gt; v1.1部分升级内容列举&lt;br&gt; 1、黑名单增强处理&lt;br&gt; 2、订阅文章,每当有新...

    org.apache.tools.zip解决解压乱码问题

    * 创建日期:2015年5月7日 - 下午1:35:02&lt;br&gt; * 版本: V0.1 &lt;br&gt; * 修改者: &lt;br&gt; * 修改日期:&lt;br&gt; */ public class ZipUtil { /** * * 功能描述:压缩文件 &lt;br&gt; * 创建者:XXX &lt;br&gt; * 创建日期...

    【转】IPMsg-多语言支持版(RTF版)

    (VC6编译)&lt;br&gt;&lt;br&gt;使用RTF格式解决在日文Windows下发送接受中文消息问题。&lt;br&gt;不过由于使用RTF,所以发送消息给其它版本的IPMsg时(比如Linux下的),对方将无法显示。&lt;br&gt;此时可以把RTF复选框去掉,不发送RTF格式...

    解决了GB2312乱码问题的ASP.NET 2.0 AJAX Control Tookit 1.0.10618

    对应的文章见&lt;br&gt;《在ASP.NET AJAX Control Toolkit 1.0.10618中使用GB2312的编码时出现乱码的两种解决方案》&lt;br&gt;http://blog.csdn.net/fancyf/archive/2007/08/21/1753404.aspx&lt;br&gt;这个修改基于官方的1.0.10618,只...

    CCP的简单的代码生成器v0.7

    如Admin表就为AdminModel&lt;br&gt; 修改了Model摸板及相关说明&lt;br&gt; 修改了AccessDAL&lt;br&gt; 修改了Page.js&lt;br&gt; 修改了PageCS摸板&lt;br&gt; 修改页面摸板,分页控件采用了AspNetPager&lt;br&gt; &lt;br&gt;错误修正: 修正了SQL SERVER生成...

    txt文本加密器

    ⊙ ◎ ⊙ &lt;br&gt; ⊙ 为了您的文件安全,软件自身带密码 , ⊙ &lt;br&gt; ◎ ◎&lt;br&gt; ⊙ ⊙&lt;br&gt; ◎ ◎&lt;br&gt; ⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙◎⊙&lt;br&gt; ⊙ ⊙ &lt;br&gt; ⊙ txt文本加密器(迷你版) ⊙...

    Fire IPBS v1.0.9 Build 050506

    相对于英文 v2.0.4 版增加功能列表:&lt;br&gt; &lt;br&gt; [一]在线列表部分&lt;br&gt; &lt;br&gt; [1]将原有的首页中的在线列表全部改为使用表格的格式化输出,更加整齐美观&lt;br&gt; [2]在线列表上方增加线列表图标图例显示&lt;br&gt; &lt;br&gt; [二]论坛...

Global site tag (gtag.js) - Google Analytics