多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP字符集编码出现乱码的解决办法

时间:2018-10-18 20:34:18 [来源]:郑州PHP培训学校

   PHP字符集编码出现乱码的解决办法

  PHP字符集编码首先应当注意的是:页面的真正字符集与 META 标签指定的应该一致;也可以使用 header("Content-Type:text/html;charset=xxx")等。
  PHP语言的功能是非常强大的,但是,PHP程序在实际编写过程中同样也会出现很多问题。我们今天将会为大家具体介绍有关PHP字符集编码的一些常见问题。几乎每个刚开始用PHP 和mySQL开发Web应用的人,都受到过编码问题的困扰。
  要么页面原始汉字和从数据库里取出的汉字全是乱码;要么原始汉字和数据库汉字,一个显示正常了,另一个就变成乱码了。很烦很气人! 问题需要一步一步的解决。在实际操作以下方法之前,需要配置 Web 服务器,使其与 PHP 集成,最终可以调试 PHP 程序。我们以常见的 GB2312 和 UTF-8 字符集为例来测试和说明。浏览器是 IE7.0。
  页面原始汉字乱码的解决
  PHP字符集编码的原理我就不说了,网上搜索一下字符串“PHP 乱码”,整框整框的文章供大家阅读。我最关心的是具体怎么做,就可以解决这个实际问题。我最喜欢使用的文本编辑器是 UltraEdit,不仅仅因为它可以进行 16 进制编辑,还因为它支持多编码文档。解决这个问题就需要使用 UltraEdit 的这个功能。
  打开中文 Windows,用 UltraEdit 创建一个文本文件,手工输入一个 PHP 页面文件,文件内容如下。保存为 test1.php 文件,注意保存时“格式”下拉框选择“默认”- 特别注意这里。
  < Html>
  < head>
  < title>页面标题< /title>
  < META http-equiv=Content-Type content="text/html; charset=gb2312">
  < /head>
  < Body>
  电脑学习网:< br>
  < /body>
  < /html>
  用 IE 浏览器打开网站的这一页面。可以看到,页面显示正常。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 GB2312。
  [Firefox 2.0 下显示正常。]
  然后,在 UltraEdit 的“文件”菜单下,选“另存为”,格式选择“UTF-8”,文件名为 test2.php。用 IE 浏览器打开这一页面。可以看到,页面显示正常(其实英文字体已经有略微的变化了)。在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,自动变了!注意 一句并没有修改,但是浏览器却自动辨别出了真实的PHP字符集编码!看来 IE 还是比较聪明的,也说明 IE 自动判别字符集是比 METE 标签中 charset=xxx 的定义优先的。
  [Firefox 2.0 下显示出现乱码。]
  在该页面首部加语句
  php
  header("Content-Type:text/html;
  charset=utf-8");
  ?>
  再次保存该页面文件,“格式”下拉框选择“默认”,文件名为 test3.php。用 IE 打开网站里的该文件,这次看到,除过英文字母,汉字变成乱码了!同时在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),字符编码是 UTF-8,已经被强制改变了。
  出现汉字乱码的原因,是因为原本的 GB2312 编码,被强制以 UTF-8 的编码形式显示,所以乱码出现了。这个时候在浏览器里人为指定 GB2312 编码,页面汉字又显示正常了(真正制作页面时是不能这么做的,非要让浏览者自己选择PHP字符集编码,一个是浏览者可能根本不知道怎么选择编码、选什么编码,再者也显得我们太菜了!)。
  [Firefox 2.0 下显示出现乱码。]
  在该页面首部加语句
  < ?php
  header("Content-Type:text/html;
  charset=GB2312");
  ?>
  再次保存该页面文件,“格式”下拉框选择“UTF-8”,文件名为 test4.php。用 IE 打开网站里的该文件,奇怪:看到页面汉字显示正常,并不是预想到的乱码?!在 IE 浏览器的“查看”/“编码”菜单下看到(勾选了“自动选择”),PHP字符集编码仍然是 UTF-8,并没有被强制改变了 GB2312 字符集。
  这个时候在浏览器里人为指定 GB2312 编码,发现 IE 浏览器并不能人为指定编码。看来 IE 浏览器对 UTF-8 字符集特别关照。无论是在 META 标签指定,还是 PHP 语句指定,都不能让 IE 浏览器显示出汉字乱码。
  [Firefox 2.0 下显示出现乱码。]
  小结一下: 以上测试主要在 IE7.0 下进行,Web 服务器为 Windows Server 2003 下的 IIS6.0,PHP 版本为 4.4.7。可以看到,IE7.0 为了正确识别字符集做了很多额外的自动处理的工作,以显示其智能和友好。有时太殷勤了反而使我们不知所措。由于汉字乱码问题与不同的浏览器及其不同的版本、Web 服务器、后台脚本和不同的字符集都有点关系,所以问题显得特别复杂。作为 Web 编程人员,主要关心与自己有关的因素就可以了,没必要成为PHP字符集编码的专家。为了兼容目前流行的 IE 和 FF 浏览器,我们可以按照以下简单的方法处理我们的 PHP 代码:
  1,页面的真正字符集与 META 标签指定的应该一致;2,也可以使用 header("Content-Type:text/html;charset=xxx"); 语句指定字符集,但是不能与字符的真正字符集冲突,也不能与 META 标签冲突。(尽管根据测试结果表明,当 header() 和 META 冲突时,header() 比 META 指定的字符集更优先,因为根据 HttpWatch Basic 跟踪显示,header() 指定字符集后,IE 浏览器 Type 会明确的得到字符集指定。但是不能保证其它非主流浏览器也会这样。)3,PHP字符集编码不能与数据库取回的字符的字符集冲突,否则页面会出现页面本身的汉字和数据库取回的汉字,全部乱码或部分乱码问题。
 
  详解PHP页面乱码的具体解决办法
  PHP页面乱码主要是在文件编码、页面申明编码、数据库连接编码这些地方出现,那么,我们就可以根据这些起因来具体解决乱码问题。
  PHP在实际编写代码中,会经常出现一些问题,比如页面出现乱码等问题。我们接下来将会具体介绍PHP页面乱码的产生原因和相关解决方法。一般来说,PHP页面乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的“天书”,其次是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存。要解决上述PHP页面乱码问题,首先需要知道开发中哪些环节涉及到了编码:
  1、文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码,它只会根据首选项的配置固定以某种编码打开文件,如果工作时候一不注意,用错误编码打开文件,做了修改之后一保存,乱码就出现了(我深有体会)。
  2、页面申明编码:在HTML代码HEAD里面,可以用<meta http-equiv="Content-Type" content="text/html; charset="XXX" />来告诉浏览器网页采用了什么编码,目前中文网站开发中XXX主要用的是GB2312和UTF-8两种编码。
  3、数据库连接编码:指的是进行数据库操作时候以哪种编码与数据库传输数据,这里需要注意的是不要与数据库本身的编码混淆,比如MySQL内部默认是latin1编码,也就是说Mysql是以latin1编码来存储数据,以其他编码传输给Mysql的数据会被转换成latin1编码。
  知道了WEB开发中哪些地方涉及到了编码,也就知道了PHP页面乱码产生的原因:上述3项编码设置不一致,由于各种编码绝大部分是兼容ASCII的,所以英文符号不会出现,中文就倒霉了。下面是一些常见的错误情况与解决:
  1、数据库采用UTF8编码,而页面申明编码是GB2312,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是PHP页面乱码,需要在查询前先使用:
  mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码的话,可以用:
  mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。
  注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的default-character-set和[mysqld]里的default-character-set来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。
  2、页面申明编码与文件本身编码不一致,这种情况很少发生,因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG,以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件,比如CuteFTP,由于软件编码配置错误而导致转换错了编码。
  3、一些租用虚拟主机的朋友,明明上述3项编码都设置正确了还是有PHP页面乱码。比方说网页是GB2312编码的,IE等浏览器打开却总是识别成UTF-8,网页HEAD里面已经申明是GB2312了,手动修改浏览器编码为GB2312后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码,在httpd.conf里面加了AddDefaultCharset UTF-8。这时候服务器会首先发送HTTP头给浏览器,其优先级比页面里申明编码高,自然浏览器就识别错了。解决办法有2个,请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312来覆盖全局配置,或者在自己目录的.htaccess里配置。
  PHP字符串替换的相关方法介绍
  PHP字符串替换可以通过strtr()这个函数来实现。具体的操作方法,我们将会在下文中提到,希望对有需要的朋友有所帮助。
  我们在实际编程中,当想实现PHP字符串替换这一功能时,通常都会用到strtr()函数。下面我们就来具体讲解一下PHP字符串替换的是实现方法。
  v先来看看这个PHP字符串替换函数 strtr()的两种状态strtr(string,from,to)
  或者strtr(string,array)
  首先针对strtr函数第一种方式
  我们看看下面的PHP字符串替换举例:
  < ?php
  echo strtr("I Love you
  ","Lo","lO");
  ?>
  得到的结果是
  I lOve yOu
  这个结果提醒我们
  1.strtr它是区分大小写的
  2.strtr的替换是很特殊的,你注意看后面那个yOu,中间的O被替换的,这显然不是我们的本意再举一个特殊例子,说明这个php sttr函数的怪异< ?php
  echo strtr("I Love
  you","Love","");
  ?>
  结果是
  I Love you
  PHP字符串替换什么也不会改变,所以strtr需要注意的是:
  3.不能被替换为空,也就是末位那个参数不能是空字符串,当然空格是可以的。
  再次举例strtr函数的另一种情况
  < ?php
  echo strtr("I Loves you","Love","lOvEA");?>
  结果是
  I lOvEs yOu
  注意看第三个参数的A,在结果中并没有出现
  4.我不建议用strtr以少换多
  ok,既然这个strtr函数挺麻烦为什么还要用呢?
  原因是,它的速度很快
  据说,strtr 比 str_replace 快四倍
  5.PHP字符串替换能用strtr函数的时候一定要用那怎么用才舒服?
  这就是它的第二种情况
  strtr(string,array)
  6.strtr符合意愿的使用方法
  < ?php
  $table_change = array('you'=>'her sister');echo strtr("I Love you",$table_change);
  ?>
  结果为
  I Love her sister
  7.小技巧:你想到PHP字符串替换该替换什么你就往数组加什么比如
  < ?php
  $table_change = array('you'=>'her sister');$table_change += array('Love' => 'hate');echo strtr("I Love you",$table_change);
  ?>
  结果是
  I hate her sister
  再次提醒那个Love 写成love 是行不通的哦。
  ok,乱七八糟说了一通,其实关于strtr最想说的就是这个后面的用法了简单方便。
  貌似后面的用法也忽略掉了前后字符长度不同的问题以上PHP字符串替换实验,PHP5.2 测试通过。
 
  PHP删除数组元素的具体函数介绍
  我们都知道,要想在数组中增加新的元素只需要直接赋值就行了。那么,如何才能实现PHP删除数组元素呢?本文做了详细介绍。
  我们在使用PHP语言进行实际代码编写时,经常会和数组打上交道,这对于初学者来说是比较困难的。今天我们就要向大家介绍如何实现PHP删除数组元素。
  PHP中的数组要添加元素非常简单,直接用赋值就行了,数组的key会自动增加,但是要删除数组中的元素呢?你想过吗?是不是很少遇到?
 
  < ? $a=array("red", "green", "blue", "yellow");count($a); //得到4
  unset($a[1]); //删除第二个元素
  count($a); //得到3
  echo $a[2]; //数组中仅有三个元素,本想得到最后一个元素,但却得到blue,echo $a[1]; //无值
  ?>
  也就是说在PHP删除数组元素后,数组中的元素个数(用count()得到)变了,但数组下标却没有重新排列,还必须用删除数组前的key来操作相应的值.
  后来我采用另一种方法,其实根本就不叫"方法",是用PHP4现成的函数array_splice().
  < ? $a=array("red", "green", "blue", "yellow");count ($a); //得到4
  array_splice($a,1,1); //删除第二个元素
  count ($a); //得到3
  echo $a[2]; //得到yellow
  echo $a[1]; //得到blue
  ?>
  把这个程序和前一个相对比,就可以看到,array_splice()不仅删除了元素,还把元素重排了,这样在数组各元素中间就不会有空值(如前例中的$a[1]).
  array_splice()其实是替换数组元素的函数,但如果不加替换值就简单的删除元素.下面是array_splice()的用法:
  array array_splice (array input, int offset [, int length [, array replacement]])参数input是要操作的数组;offset是从第几个元素开始,为正时从第一个元素开始数,为负时从最后一个元素开始数;length为要替换/PHP删除数组元素的个数,省略时就从offset开始到数组结束,也是可正可负,原理和offset一样;relacement为要替换的值.
 
  PHP简单语法的详细介绍
  PHP简单语法可以包括:PHP脚本代码标记;PHP指令分隔符;PHP的注释;PHP的输出;PHP的变量;PHP中的单引号和双引号之别。
  PHP语言的语法不是很复杂,它的简易型和强大的功能成为许多程序员的首选计算机语言。今天我们将为大家具体讲解有关PHP简单语法的一些介绍。
  PHP简单语法一,PHP脚本代码标记
  PHP的脚本是文件中一对特殊标记所包括的内容,如ASP是“<%....%>”,PHP可看成是“< ?...?>”。
  然而为了适应XML标准以将PHP嵌入到XML或XHTML中,PHP不建议使用短格式的“< ?...?>”,而建议使用长格式标记“< ?php...?>”
  此外PHP代码块还支持 <script language="php">...</script>的标记形式。
  PHP简单语法二,PHP指令分隔符
  PHP的每条语句需要由分号“;”隔开,但对于PHP结束标记“?>”来说,因其自动隐含一个分号,所以不需要追加分号。
  所以,一个PHP脚本的格式可如下:
  < ?php
  //注意最后一行可以没有分号
  ?>
  PHP简单语法三,PHP的注释
  PHP多行注释使用 “”
  单行注释使用“#”或“//”
  PHP简单语法四,PHP的输出
  ASP中使用“<%=...%>”快速输出单行,或使用“<%Response.Write("...")%>”
  在PHP中直接使用“echo()”或“print()”,比如:
  < ?php
  echo "a";
  echo (b);
  echo ("c");
  echo d;
  ?>
  将输出为“abcd”,以上四种均能正常输出。
  但这在ASP中,尤其是 echo "a";和 echo d; 均输出为字符串本身,是不可能的。这就需要了解到PHP的变量定义。
  PHP简单语法五,PHP的变量
  和ASP一样,PHP变量也可以不需要先定义,直接使用即可。对于变量的类型,在赋值时自动生成。
  PHP中的各种变量均在变量名前加上“$”以示区别。
  < ?php
  $a="123";
  echo a;
  echo $a;
  ?>
  输入为“a123”
  PHP简单语法六,PHP中的单引号和双引号之别
  < ?php
  $a="123";
  echo "$a";
  echo '$a';
  ?>
  输出为“123$a”,其中 echo "$a" 输出了变量a的值,而 echo '$a' 输出的是单引号中的字符串本身。
  < ?php
  $a="123";
  echo "$a'$a'";
  ?>
  则输出为“123'123'”并不是“123$a”。虽然是'$a',但置于双引号下变量还是被替换了。
  所以,可以得出:只要是双引号中内容中的变量,都会被替代;而单引号中的则不作任何替换。
  双引号中的内容需转义的,使用“”前缀,比如“”,“$”、“"”。所以要输入“123$a”,则为< ?php
  $a="123";
  echo "$a$a";
  ?>
  再比如:
  < ?php
  $a="123";
  echo "$a$a"";
  ?>

上一篇:PHP整数取余返回负数的相关解决办法

下一篇:正确理解PHP程序编译时的错误信息