最近碰到一个项目,要求使用gb2312,平常写代码时,用的编码都是utf-8,这两者有什么区别呢,我们又该如何选择呢
首先我们要理解编码是什么,编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。
utf-8和gb2312是编码格式的一部分,查阅了一下有关utf-8和gb2312的资料:
utf-8:是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。utf-8用1到4个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)
gb2312:信息交换用汉字编码字符集。《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是gb2312—1980。gb2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持gb2312。
国内很多大的网站比如:百度搜索,新浪网,搜狗搜索引擎等用的编码都是utf-8,部分网站,学校官网则使用gb2312。
所以utf-8是国际编码,gb2312是中文编码,如果只是国内用户使用的话,则选择gb2312,但是国外访问gb2312编码的网站就会乱码,而utf-8是世界性通用代码,国内国外访问均不会出现乱码状况。
总结:从文字支持上说utf-8比GB2312要多。一般企业站看情况自己选择网页编码。在开发的时候就要确定使用哪种编码,以防网页乱码。同时在dedecms、帝国、phpcms等网站系统时,开发HTML和使用开源程序编码也要保持一致(前几天自己用gb2312的HTML在编码为utf-8的phpcms上套模板,就出现网页乱码情况)。当然个人比较倾向utf-8,感觉很少出现乱码状况。
页面不缓存可以让我们有更新就立即更新出来用户不需要清除浏览器缓存或不停的按f5刷新了,这里整理了解一些关于页面不缓存的方法,具体的如下。一,js,css,图片文件不缓存
style.css?v=<?php echo time(); ?>
style.css?v=2
css
a.js?v=Math.random();
二,html页面不缓存
HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:
no-cache,浏览器和缓存服务器都不应该缓存页面信息;
public,浏览器和缓存服务器都可以缓存页面信息;
no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
Last-Modified只页面的最后生成时间,GMT格式;
Expires过时期限值,GMT格式,指浏览器或缓存服务器在该时间点后必须从真正的服务器中获取新的页面信息;
方法一:在<head>标签里增加如下meta标签。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=8">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache" content="no-cache">
方法二:在java代码中增加如下代码。
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires",0);
方法三:asp教程做法
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "No-Cache"
方法四:php教程做法
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
?>
一个页面上的资源,可以简单分为两种:
url 可变,比如这个页面上的 css 文件,这次可能是 app.fe5a24f8ae.css,下次可能是 app.613e5f58f1.css
url 不可能变,比如这个页面的 url
针对它们,我们的缓存方式可以不同。
比如第一种,我们可以这样设置响应头:
Cache-Control max-age=31536000, must-revalidate
表示这个资源一年内都有效,过期的话才要到服务器上验证。
那么,我们如何保证资源修改后能及时更新到用户端?修改 url 即可。
而针对第二种,因为 url 无法改变,我们就需要另外的方式。
比如:
Cache-Control no-cache
no-cache 不是表示不能缓存,而是说每次浏览器都要跟服务器做个确认 – 通过 ETag 或 Last-Modified,这样就会多出一个请求 。
对于 HTML 文档谨慎设定过期时间
大部分情况下,对于其他图片、CSS、JavaScript 等资源的请求都来自一个单一的 HTML 文档。对于这类页面通常应该设定比较短的过期时间,或者干脆不设定。因为如果这类页面被缓存,那么页面中包含的资源的文件名等等信息都会一并被缓存,导致对它的更新难以确保立即对用户生效。
引用静态资源时,不要使用 Query String
Query String 就是例如?key=val的字符串,如
<script" width=100% src="/static/js/func.js?v=a87ff8"></script>
这会阻止一部分较老的浏览器(包括 IE6 )对该资源进行缓存。
设定缓存的方法
对于 Apache 服务器,可以通过 mod_expires 模块来设定ExpiresHTTP 头或Cache-ControlHTTP 头的max-age指令。编辑相应目录下的 .htaccess 文件,或直接对 Apache 的配置文件(根据服务器系统版本不同,可能为httpd.conf或apache2.conf等)作出修改。
分文件类别设定
使用ExpiresByType可以按照文件的 MIME Type 设定某一类文件的过期日期。例如:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 2 weeks"
ExpiresByType image/x-icon "access plus 6 months"
ExpiresByType image/gif "access plus 6 months"
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpeg "access plus 6 months"
ExpiresByType video/x-flv "access plus 6 months"
ExpiresByType application/pdf "access plus 6 months"
</IfModule>
其中access plus 1 week表示将缓存过期设置为访问时间(即当前时间)之后的一周。如果将access替换为modification,则缓存过期会被设定为文件修改时间之后的一周。可以使用的时间单位包括:
years
months
weeks
days
hours
minutes
seconds
不同的时间也可以进行组合,例如:
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
根据文件扩展名进行设置
如果希望根据扩展名来指定缓存规则,可以使用FilesMatch配合正则表达式。为了简洁,我这里只规定了ExpiresDefault。它的优先级很低,只会在对应文件没有任何其他规则能够匹配(包括上层目录下的缓存规则)时生效。
<IfModule mod_expires.c>
<FilesMatch "\.(css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
对某些文件设定
同理,也可以对某些文件启用特定的缓存策略。注意,文件名中的点(.)是需要转义的。
<IfModule mod_expires.c>
<FilesMatch "^(example\.css|example\.js)$">
ExpiresActive on
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
对某一文件夹下的所有文件设定
对于静态文件,一个比较方便的做法是将它们全部放到一个目录下,并对该目录下的所有文件设定。但是,此处需要注意防止其他规则将ExpiresDefault覆盖掉。
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 10 years"
</IfModule>