PHP页面编码声明:用header或meta实现的区别及相关操作
这几种情况之间的区别

或者为GBK编码
php页面为utf8编码
字符编码设置为utf-8
php页面为gbk编码
字符编码为gb2312
php页面为big5编码
设置字符编码为big5
通常情况以上代码放在php页面的首页
一.HTML页面转UTF-8编码问题
1.在head后,title前加入一行:
顺序不能错,一定要在
显示的标题有可能是乱码!
2.html文件编码问题:
点击编辑器菜单。选择“文件”。再选择“另存为”。这时能看到当前文件的编码。要确保文件编码是UTF - 8
如果是ANSI,需要将编码改成:UTF-8。
3.HTML文件头BOM问题:
有时会在文件开头加上一个BOM标签
在个BOM标签可能会导致浏览器在显示中文的时候出现乱码。
删除这个BOM标签的方法:
能够借助Dreamweaver打开文件。之后重新进行保存。如此便能够将BOM标签去除。
可以用EditPlus打开文件。在菜单“首选项”中。找到“文件”选项。进入“UTF-8标识”设置。将其设置为“总是删除签名”
然后保存文件,即可以去除BOM标签!
4.WEB服务器UTF-8编码问题:
如果你按以上所列的步骤做了,还是有中文乱码问题,
请检查你的所使用的WEB服务器的编码问题
具体格式可参考apache的配置文件
要是你用的是Nginx。那就把nginx.conf里的:charset设置为utf-8
具体去找到“charset gb2312;”或者类似这样的语句。然后将其改成:“charset utf-8;”
二.PHP页面转UTF-8编码问题
1.在代码开始出加入一行:
字符编码为utf-8
2.PHP文件编码问题
点击编辑器的菜单:“文件”->“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,
如果是ANSI,需要将编码改成:UTF-8。
3.PHP文件头BOM问题:
PHP文件一定不可以有BOM标签
否则,会出现session不能使用的情况,并有类似的提示:
警告:session_start() [函数.会话开始]:无法发送会话缓存限制器 - 标头已发送
这是因为执行session_start()时整个页面不能有输出。但由于前PHP页面存在BOM标签。
PHP把这个BOM标签当成是输出了,所以就出错了!
所以PHP页面一定要删除BOM标签
删除这个BOM标签的方法:
1.可以用Dreamweaver打开文件,并重新保存,即可以去除BOM标签!
2.可以用EditPlus打开文件,并在菜单“首选项”->“文件”->"UTF-8标识",设置为:“总是删除签名”,
然后保存文件,即可以去除BOM标签!
4.PHP以附件形式保存文件的时候,UTF-8编码问题:
PHP以附件形式保存文件,文件名必须是GB2312编码,
否则,如果文件名中有中文的话,将是显示乱码:
如果你的PHP本身是UTF-8编码格式的文件,
需要将文件名变量由UTF-8转成GB2312:
将“$filename”从UTF - 8编码转换为GB2312编码
5.截断显示文章标题时,出现乱码或者“?”问号的问题:
一般情况下。当文章标题很长时。会显示一部分标题。会对文章标题进行截断
由于一个UTF-8编码格式的中文字符会占用3个字符宽度,
其宽度为1个字符或2字符
没截取完整,将出现乱码或“?”问号的情况,
用下面的函数截取标题,就不会有问题:
函数名为get_brief_str,它有两个参数,分别是$str和$max_length
echo strlen($str) ."
";
如果字符串的长度大于最大长度
$check_num = 0;
for($i=0; $i < $max_length; $i++)
if(ord($str[$i]) > 128)
$check_num++;
if($check_num % 3 == 0)
将字符串$str从起始位置截取到最大长度$max_length。然后在截取后的字符串末尾加上省略号“...”
elseif($check_num % 3 == 1)
先取字符串$str从起始位置到$max_length + 2的部分。然后在这部分后面加上省略号“...”。
elseif($check_num % 3 == 2)
将字符串$str从开头截取到$max_length加1的位置。然后拼接上省略号“...”
return$str;
三.MYSQL数据库使用UTF-8编码的问题
1.用phpmyadmin创建数据库和数据表
或执行语句:
校对规则为utf8_general_ci
创建数据表时,若该字段用于存放中文,那么要将“整理”设为“utf8_general_ci”。
如果该字段是存放英文或数字的话,默认就可以了。
相应的SQL语句,例如:
CREATETABLE`test` (
`id`INTNOTNULL,
`name`为VARCHAR(10)类型。字符集是utf8。校对规则是utf8_general_ci。不能为空。
PRIMARYKEY( `id` )
) ENGINE=MYISAM ;
2.用PHP读写数据库
在连接数据库之后:
该函数参数依次为主机名、主机用户、主机密码
加入两行:
执行设置字符集为'utf8'的操作//用于读库
执行“set names 'utf8'”的操作 此操作用于写库
就可以正常的读写MYSQL数据库了。
四.JS相关的UTF-8编码问题
1.JS读Cookie的中文乱码问题
进行escape编码
否则JS读到cookie中的中文字符将是乱码。
然而php自身不存在escape函数 于是我们重新编写一个escape函数
functionescape($str)
使用正则表达式在字符串$str中进行匹配。匹配的内容是:由\x80到\xff之间的任意一个字符,或者由\x01到\x7f之间的一个或多个字符组成的内容。匹配结果存储在数组$r中。
$ar = $r[0];
foreach($ar as $k=>$v)
if(ord($v[0]) < 128)
$ar[$k] = rawurlencode($v);
else
将变量$v从UTF - 8编码转换为UCS - 2编码。对转换后的结果进行二进制到十六进制的转换。将转换后的十六进制值前面加上“%u”,并赋值给数组$ar的索引为$k的元素。
returnjoin("",$ar);
JS读cookie的时候,用unescape解码,
然后就解决cookie中有中文乱码的问题了。
2.外部JS文件UTF-8编码问题
当一个HTML页面或则PHP页面包含一个外部的JS文件时,
如果HTML页面或则PHP页面是UTF-8编码格式的文件,
外部的JS文件同样要转成UTF-8的文件,
否则将出现,没有包含不成功,调用函数时没有反应的情况。
点击编辑器的菜单:“文件”->“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,
如果是ANSI,需要将编码改成:UTF-8。
五.FLASH相关的UTF-8编码问题
FLASH内部对所有字符串,默认都是以UTF-8处理
1.FLASH读文普通本文件(txt,html)
要将文本文件的编码存为UTF-8
点击编辑器的菜单:“文件”->“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,
如果是ANSI,需要将编码改成:UTF-8。
2.FLASH读XML文件
要将XML文件的编码存为UTF-8
点击编辑器的菜单:“文件”->“另存为”,可以看到当前文件的编码,确保文件编码为:UTF-8,
如果是ANSI,需要将编码改成:UTF-8。
在XML第1行写:
3.FLASH读PHP返回数据
如果PHP编码本身是UTF-8的,直接echo就可以了
要是PHP编码本身为GB2312,那么能够把PHP转存成UTF - 8编码格式的文件,直接进行echo操作就行
要是PHP编码自身是GB2312的。并且不允许更改文件的编码格式。
用下面的语句将字符串转换成UTF-8的编码格式
将$str从GB2312编码转换为UTF - 8编码并赋值给$new_str
再echo就可以了
4.FLASH读数据库(MYSQL)的数据
FLASH要通过PHP读取数据库中的数据
PHP自身的编码没那么重要。关键在于要是数据库的编码为GB2312。
需要用下面的语句将字符串转换成UTF-8的编码格式
$new_str = iconv("GB2312", "UTF-8", "$str");
5.FLASH通过PHP写数据
一句话,FLASH传过来的字符串是UTF-8格式的,
又或者直接显示等
还是用iconv函数转换
6.FLASH使用本地编码(理论上不推荐使用)
如果想让FLASH不使用UTF-8编码,而是使用本地编码
对于中国大陆地区而言,本地编码是GB2312或GBK
AS程序内,可以添加以下代码:
System.useCodepage = true;
那么FLASH内所有字符都是使用GB2312的编码了
都应做相应编码转换
因此不推荐使用
用header或meta实现PHP页面编码的区别
一、页面编码
1. 使用 标签设置页面编码
这个标签的作用是声明客户端浏览器显示该页面所用的字符集编码。xxx可为GB2312、GBK、UTF-8等(与MySQL不同,MySQL是UTF8)。所以,大部分页面能用这种方式告知浏览器显示此页面时采用的编码。如此才不会因编码错误而产生乱码。但是有时我们会发现,即便有了这句仍不行。不管xxx属于哪一种,浏览器采用的始终是一种编码。这个情况我后面会谈到。
请注意 这属于html信息 它只是一个声明 其作用是表明 服务器已将HTML信息 传至浏览器
字符编码为xxx
函数header()有作用。其作用是将括号里的信息发送到http标头。
如果括号内内容如文中所述,那么其作用与标签基本相同。大家对照第一个查看会发现字符大致相同。但不同之处在于,若有这段函数,浏览器会始终采用你所要求的xxx编码,绝对不会不遵从。所以这个函数很有用。为何会这样呢?这就得讲讲HTTPS标头与HTML信息的差别了:
https标头是服务器送出的字串。这个字串是在以HTTP协议传送HTML信息到浏览器之前送出的。
meta标签属于html信息。header()发送的内容先到达浏览器。通俗来讲,header()的优先级高于meta。不确定是否能这样表述加入一个php页面。该页面既有header("content-type:text/html; charset=xxx")。又有其他内容。此时浏览器就只认前者http标头而不认meta了。当然这个函数只能在php页面内使用。
同样也存在一个问题。为何前者必定起作用。而后者有时却不行呢。这便是接下来要探讨的Apache的缘由了。
3. AddDefaultCharset
Apache根目录的conf文件夹中,存有整个Apache的配置文档httpd.conf。
用文本编辑器打开httpd.conf。在第708行(不同版本位置可能不同)。这里有AddDefaultCharset xxx。其中xxx是编码名称。这行代码的含义是。将整个服务器内网页文件https标头里的字符集。设置为你默认的xxx字符集。有这行。就如同给每个文件都添加了一行。内容是header("content-type:text/html; charset=xxx")。这下就能明白。为何明明meta设置为utf-8。但浏览器却始终采用gb2312了。
要是网页里存在header("content-type:text/html; charset=xxx")。那就将默认的字符集改成你所设置的字符集。故而这个函数始终有用。要是在AddDefaultCharset xxx前面加上“#”,将这句注释掉。并且页面里没有header("content-type…")。此时就轮到meta标签发挥作用了。
总结:
来个排序
设置字符编码为xxx
AddDefaultCharset xxx
要是你身为web程序员,那就给你的每个页面都加上header("content-type:text/html; charset=xxx") 。要确保它在任何服务器都能够正确显示。它的可移植性很强。
至于那句添加默认字符集xxx,是否要注释因人而异。反正我把它注释掉了,不过我写页面时也要写设置头部信息的函数,以便放到服务器上能正常显示
二、数据库编码
PHP程序在查询数据库前,会先执行mysql_query(“SET NAMES xxxx”)。xxxx是网页的编码,即charset=xxxx。若网页中charset=utf8,那么xxxx=utf8。若网页中charset=gb2312,那么xxxx=gb2312。几乎所有WEB程序都有一段连接数据库的公共代码,放在一个文件里。在这个文件里,加入mysql_query(“set names”)就行。
SET NAMES可显示客户端发送的SQL语句所使用的字符集。所以,SET NAMES 'utf-8'语句告知服务器,未来从该客户端传来的信息将采用utf-8字符集。它还为服务器发送回客户端的结果指定了字符集。它表示列值使用了什么字符集
PHP页面编码统一
这几种编码都要保持一致
MySQL数据库编码:建立数据库时指定编码(比如gbk_chinese_ci)。建立数据表时不要指定编码。建立字段时不要指定编码。插入数据时不要指定编码,会自动继承数据库的编码。
数据库连接时,也有编码,可以在连接完数据库后,执行
mysql_query('SET NAMES gbk');//把gbk替换成你的编码,比如utf8。
2、html页面的编码,指的是这一行的设置:
用editplus打开php文件。用editplus打开html文件。另存时。选择编码。若数据库和页面编码是gbk。则这儿的编码选择ansi。若数据库和页面编码是utf-8。则这儿也选择utf-8。
另外需要注意,Javascript或Flash传递的数据采用utf-8编码。若数据库和页面编码为gbk,需进行转码,之后写入数据库。
将$content从utf-8编码转换为gbk编码
在PHP程序里 能够添加一行 用以指定PHP源程序的编码
字符编码为gbk