php页面编码和字符操作

咱俩可就此header来定义一个php页面为utf编码或GBK编码,也可于html中因故meta标签来指定编码

例如:php页面为utf编码
   header(“Content-type: text/html; charset=utf-8”);

咱们常见以header或meta,下面说一样游说两者的分别

 

相同、采用meta页面编码

 
用meta来安页面编码

1 <meta http-equiv="content-type" content="text/html; charset=编码类型">

 
 作用是:声明客户端的浏览器用啊字符集编码显示该页面,起至通知浏览器的作用。只有字符编码与浏览器编码相同时才不见面促成错误而发乱码。

 

第二、采用header()页面编码

之所以header()来装页面编码

1 header("content-type:text/html; charset=编码类型"); 

header是发送原始
HTTP
标头,作用是管括号内的信发至http标头,浏览器会采用header()中安装的编码。

 

老三、AddDefaultCharset方式设置编码

   
 
注意:
早先版本的Apache配置时修改AddDefaultCharset这个选项,要改成呢gb2312或者utf-8,否则汉字会变为乱码,但自Apache
2.0.53
开始,取消了AddDefaultCharset,现在之初本子会由适应浏览器的。所以在apache2.4负凡是寻觅不顶AddDefaultCharset的。

 文档中:

PHP 1

小版本的Apache的
.conf 文件里,有AddDefaultCharset。可以安装defaultcharset
 字符编码(删除前面的#)。设置完成后一定给在每个文件被丰富header(“content-type:text/html;
charset=字符编码”)。

 

但是与header()还是产生分别之(优先级无一致)

1:如果页面没有点名编码 ,
Apache配置defaultcharset gbk , 页面文件编码是utf-8。

     页面显示是乱码。在页面没有meta指明charset,设置defaultcharset
gbk,这个时节服务器的装置生效,编码不一样,造成乱码;

2:如果页面指定编码为utf-8, 
Apache配置defaultcharset  gbk. 页面文件编码是utf-8。

     页面显示乱码。设置defaultcharset
gbk,会挂页面级别(meta)的编码设置;

3:如果页面header申明charset为utf8,
Apache配置defaultcharst gbk,页面文件编码是utf8。

     页面显示正常。这个证header优先级要逾服务器和浏览器的安;

4:如果Apache关闭DefaultCharset

   
 页面显示正常。 

 
由此得出结论:

     
 header() >> AddDefaultCharset
>> meta

     
 所以添加header()是比较好之措施

 

季、编码转换函数

 

1:mb_detect_encoding
检查编码

1 $string = "赵亚飞";
2 $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
3 header("content-Type: text/html; charset=".$encode);
4 echo $string;

   
有时见面产出检查错误(解决办法)例如:对和GB2312和UTF-
8,或者UTF-8和GBK网上说是由于字符短是,mb_detect_encoding会出现误判。 不是bug,写序时为无应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性非常充分。 

$encode =
mb_detect_encoding($keytitle,
array(‘ASCII’,’GB2312′,’GBK’,’UTF-8′); 

其三个参数分别是:被检测的输入变量、编码方式的检测顺序(假使为真正,后面自动忽略)、strict模式 
对编码检测的各个进行调,将最为老可能在前方,这样减少给错误转换的时机。 一般只要先排gb2312,当起GBK和UTF-8时,需要将常用之排列到前边。

 

2:mb_convert_encoding
转换编码

函数原型:string
mb_convert_encoding ( string str, string to_encoding [, mixed
from_encoding] )
例如:  

1 1: 将任意类型( 'ASCII,GB2312,GBK,UTF-8')字符串$html_str转换成'UTF-8'编码
2      $html_str = mb_convert_encoding($html_str, 'UTF-8', 'ASCII,GB2312,GBK,UTF-8');
3 2:gbk To utf-8
4  < ?php 
5     header("content-Type: text/html; charset=Utf-8"); 
6     echo mb_convert_encoding("赵亚飞", "UTF-8", "GBK"); 
7  ?> 

瞩目:使用方面的函数需要安装可用先enable
mbstring 扩展库。 在 php.ini里用; extension=php_mbstring.dll 前面的
; 去掉

mb_convert_encoding
可以指定多种输入编码,它会根据内容自动识别,;实践效率比较iconv差很多 

 

**3:iconv 易编码**

**iconv函数库能够不辱使命各种字符集间的更换,是php编程中不得缺失的根基函数库。**


亟待小心一下:

iconv在转移字符有时见面错,(如果用utf-8转换为gb2312时,可能会见面世字符串被截断的图景时有发生。)

釜底抽薪方式:在急需变更成的编码后加 “//IGNORE”
是iconv函数第二个参数后。

如下: 

1  iconv("UTF-8","GB2312//IGNORE",$data) 

ignore意思是忽视转换时之荒唐,如果无ignore参数,所有拖欠字符后面的字符串都心有余而力不足让封存(不为下开展换)。

iconv不是php的默认函数,也非是默认安装之模块。需要安装才能够为此之。 

此地发出一个电动判断编码类型,进行转发的函数:

 1 function check_encod($encod,$string){
 2          //判断字符编码
 3         $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));
 4         var_dump($encode);
 5         if($encode != $encod){
 6              $string = iconv($encode, $encod, $string);
 7          }
 8          return $string;
 9  }
10 $path = "赵亚飞。.jpg";
11 $path = check_encod("GB2312",$path);

 

五:字符串截取

1:mb_substr()

      PHP
substr()函数可划分文字,但分割的文字如果包括中文字符往往会碰到问题,这时可以就此mb_substr()这个函
数,用法与substr()相似,只是在mb_substr()最后只要在多一个参数,以设定字符串的编码, 需要开拓php_mbstring.dll,需要在php.ini中把php_mbstring.dll打开。例如:

1  echo mb_substr('赵亚飞赵亚飞er',0,9);         //输出:赵亚飞
2  echo mb_substr('赵亚飞赵亚飞er',0,9,'utf-8'); //输出:赵亚飞赵亚飞er

 
 第一只是以三独字节为一个国语,这便是utf-8编码的风味,下面加上utf-8字符集说明,是因一个许呢单位来截取的

 2:iconv_substr()

     
Substr是截取字符的函数,但是多下,截取中文也用分外处理,原因是华语在UTF-8中占用3单字节,在GB2312中占据2只字节,在截取中随时有截取的字符串长度及构成未知,所以让众多总人口造成了麻烦。PHP5开始,iconv_substr函数出现

1 <?php
2       $str='赵z亚y飞f/include';  
3       echo substr($str,1,5);
4       echo "<br>";
5       echo iconv_substr($str,1,5,"UTF-8");  
6 ?>  

   
 这个是在网页编码为UTF-8的PHP代码中以的截取编码。如果在UTF-8网页遭到采取GB2312或者GBK编码来截取,会拧,占用字节不同;反之,在GB2312或GBK网页遭到,不能够采用UTF-8来开展截取
。由于iconv_substr是按字符而非占用字节来算,所以“a”和“叶”均计算呢1各类。在GB2312或者GBK中,由于占用字节是均等的,所以可以自由动用GB2312或GBK编码来截取,截取结果是同的。

3:PHP兼容性好的截取字符串的函数

 

 1     /**
 2       * 截取字符串兼容各种编码
 3       * 
 4       * @param string $str
 5       * @param int    $start    //开始截取位置默认是0
 6       * @param int    $length   //截取长度
 7       * @param string $charset  //字符编码
 8       * @param int    $is_addnode  //是否加省略号
 9       * @return string
10       **/
11     public static function cut_string($str, $start=0, $length, $charset="", $is_addnode=true){
12         if(empty($str) || $str == ''){
13             return $str;
14         }
15         $real_set = mb_detect_encoding($str, array("UTF-8", "ASCII", "GB2312", "GBK", "BIG5"));
16         if(empty($charset)){
17             //没有传编码就按本身编码;
18             $charset = $real_set;
19             if(empty($charset)){
20                 $charset = 'utf-8';
21             }
22         }else{
23             if($real_set != $charset){
24                 //如果编码不一致就设置为传入的编码,防止截取乱码
25                 $str = iconv($real_set, $charset, $str);
26             }
27         }
28         
29         //兼容没有安装扩展的情况
30         if(function_exists("mb_substr")){
31             $cut_str = mb_substr($str, $start, $length, $charset);
32         }elseif(function_exists('iconv_substr')) {
33             $cut_str = iconv_substr($str, $start, $length, $charset);
34         }
35         if($is_addnode){
36             if($str == $cut_str){
37                 return $cut_str;
38             }else{
39                 return $cut_str . "......"; 
40             } 
41         }else{
42             return $cut_str;
43         }
44         //兼容正则截取
45         $preg['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
46         $preg['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
47         $preg['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
48         $preg['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
49         preg_match_all($preg[$charset], $str, $match);
50         $string = join("",array_slice($match[0], $start, $length));
51         if($is_addnode){
52             return $string . "......";
53         }
54         return $string;
55     }

 

 

相关文章