页:
[1]
|
PHPer使用UTF-8注意事项
本文的作用是为了全方位的避免因使用UTF-8编码而产生的乱码问题,不包含具体的乱码解决方案和编码转换的内容。对于UTF-8编码的深入了解,请参阅:《PHP匹配UTF-8中文字符的正则表达式》
1、编辑器:不要使用任何微软的编辑器,什么Frontpage,Web Designer,记事本,写字板什么的,能丢的全部丢开,因为这些编辑器会在你的UTF-8文档前面产生BOM,关于BOM的具体说明,可以在 这里 找到,当年我直接拿记事本转UTF-8覆盖原文件,造成大量代码损毁,至今记忆犹新。
2、MySQL数据库:注意建库,建表,建字段(注意有三处)的时候,都要选用utf8_general_ci的整理格式(Collation),在PHP使用mysql_connect()函数连接数据之后,需要加上一句:
mysql_query('set names "utf8"');
3、PHP:
使用mbstring库,不要使用iconv库。
使用preg而不要使用ereg来处理字符。
使用htmlentities()函数,html_entity_decode()函数的时候要带上第三个参数:[code]<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
$str = "<a href='test'>中文</a>";
echo htmlentities($str,ENT_COMPAT,"UTF-8"); //显示(源代码里面) <a href='test'>涓枃</a>
echo html_entity_decode(htmlentities($str,ENT_COMPAT,"UTF-8"),ENT_COMPAT,"UTF-8"); // 显示(源代码里面) <a href='test'>中文</a>
?>[/code]这里再给出一个匹配UTF-8中文字符的正则表达式:[code]<meta http-equiv="Content-Type" Content="text/html; charset=utf-8">
<?php
$word = "中文";
if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$word) == true)
{
echo "很好,这是一个UTF-8编码的汉字";
}
else
{
echo "抱歉,这不是一个UTF-8编码的汉字";
}
?>[/code]4、HTML:在<head></head>标签对里面加上
<meta http-equiv="Content-Type" c />
5、JS:JS的问题比较复杂,如果直接将文件存为UTF-8的编码,那么当用户在直接用浏览器访问这个页面的时候(也许某些程序员会这么做),浏览器可能会使用其它的编码去读取这个文件而造成其中的UTF-8中文乱码,当然,这并不会影响到程序的运行。在加载JS的时候,可以说明一下载入JS的编码,当然,如果已经在HTML头里面声明了编码,这里就不是必须的了:
<script type="text/javascript" language="javascript" src="scripts/output.js" charset="UTF-8"></script>
JS要注意的另一个问题是他的escape()函数,在ECMAScript v3中,escape( ) 会被剔除,建议使用encodeURI( )和encodeURIComponent( )。这可以帮助你远离escape()函数引起的乱码问题。
6、CSS:在CSS文件的头部加上这行代码:
@charset "UTF-8";
7、URL:为了让URL变得更为友好,许多PHP程序员喜欢让URL显示文字而不是URL编码,目前较为合理的解决方案是将GET方法发送的数据转为GBK编码,然后再接受这些数据,如果你希望使用UTF-8直接友好的GET数据,你会在使用PHP的$_GET数组时遇到一些问题。
8、Email:使用UTF-8编码的字符发送邮件,也是一件让人头疼的事情,理想的方法是将编码转变为GBK,然后再发送。
9、Ajax:使用POST的方式发送数据,不要使用GET的方式,不然无法成功发送部分UTF-8中文字符。 |
|
浏览器对象模型(Brower Object Model)
document frames history location navigator screen
document对象的属性:
anchors forms images links location
window对象
观察BOM的体系结构,所有的对象都源自window对象,它表示整个浏览器窗口。
Frame实际是个array,如果窗口分祯的话,每个frame相当一个单独的window对象,如window.frames[0](注意,top对象的使用,top永远指向最外层的祯,top.frames[0], 因为当你的代码被包括在某个frame中是,这时候window指向的是当前祯,这也许不是你的原意,所以尽量使用top来避免错误)
parent ,self,top,window的关系:
parent:如果当前窗口为frame,指向包含该frame的窗口的frame (frame)
self :指向当前的window对象,与window同意。 (window对象)
top :如果当前窗口为frame,指向包含该frame的top-level的window对象
window :指向当前的window对象,与self同意。
window的有用属性/对象与方法
大小与移动:
moveBy,moveTo,resizeBy,resizeTo;
打开popup窗口:
open;
系统提示窗:
alert(),confirm(),prompt;
状态栏:
Status,defaultStatus;
时间间隔:
setTimeout(),setInterval;
历史纪录:
history.go(-1)后退
document对象
唯一BOM和DOM都有的对象。从BOM的角度看,侧重于从集合的角度看问题,把页面划分为不同的部分,以及页面本身的一些属性,如背景色,标题名称等,由于BOM的实现是基于浏览器的,所以不同浏览器的属性和方法有不一致之处,这造成很多麻烦。注意一些一致的,常用的属性和方法,BOM把页面分为如下几部分:
anchors : Collection of all anchors in the page(represented by <a name="anchorname"></a>)
applets : Collection of all applets in the page
forms : Collection od all embeded objects in the page(represented by the <embed /> tag)
images : Collection of all forms in the page
links : Collection of all links in the page (represented by <a href="somewhere.htm"></a>)
location 对象
指浏览器窗口中输入的URL,它有很多属性,即把URL拆为了很多部分,分别表示之,如href,host,port,pathname等
Navigator对象
更加针对浏览器,举一些IMOS都有的例子如appCodeName,appName, userAgent等
Screen对象
这个Screen指的是客户计算机的屏幕,如我的机器的Screen.Heigh和Width为768X1024,例如可以用这个属性将浏览器置为全屏:
window.moveTo(0, 0);
window.resizeTo(screen.availWidth, screen.availHeight); |
|
使用htmlentities()函数,html_entity_decode()函数的时候要带上第三个参数:
這個是好東西! |
| pangmen | 2007-11-17 06:42 AM |
|
| bom可以清除的,我这有一个清除函数,需要的话可以问我拿 |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.005991 second(s), 2 queries |