我们可以用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. 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的。
 文档中:
低版本的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. 2gbk 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:兼容性良好的截取字符串的函数

  1. 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. }

php页面编码与字符操作的更多相关文章

  1. dedecms功能性函数封装(XSS过滤、编码、浏览器XSS hack、字符操作函数)

    dedecms虽然有诸多漏洞,但不可否认确实是一个很不错的内容管理系统(cms),其他也不乏很多功能实用性的函数,以下就部分列举,持续更新,不作过多说明.使用时需部分修改,你懂的 1.XSS过滤. f ...

  2. day08(字符编码,字符与字节,文件操作)

    一,复习 ''' 类型转换 1.数字类型:int() | bool() | float() 2.str与int: int('10') | int('-10') | int('0') | float(' ...

  3. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  4. Python编程Day7——字符编码、字符与字节、文件操作

    一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...

  5. Python之字符编码与文件操作

    目录 字符编码 Python2和Python3中字符串类型的差别 文件操作 文件操作的方式 文件内光标的移动 文件修改 字符编码 什么是字符编码? ''' 字符编码就是制定的一个将人类的语言的字符与二 ...

  6. DAY7 字符编码和文件操作

    一.软件与python解释器打开文件的方法 1.软件打开文件读取数据的流程: 1. 打开软件 2. 往计算机发生一个打开文件的指令,来打开文件 3. 读取数据渲染给用户(存取编码不一致:乱码) 2.p ...

  7. Day 07 字符编码,文件操作

    今日内容 1.字符编码:人识别的语言与机器识别的语言转换的媒介 2.字符与字节:字符占多少字节,字符串转换 3.文件操作:操作硬盘的一块区域 字符编码 重点:什么是字符编码 人类能识别的字符等高级标识 ...

  8. Python 入门基础6 --字符编码、文件操作1

    今日内容: 1.字符编码 2.字符与字节 3.文件操作 一.字符编码 了解: cpu:将数据渲染给用户 内存:临时存放数据,断电消失 硬盘:永久存放数据,断电后不消失 1.1 什么是编码? 人类能够识 ...

  9. Python基础之字符编码,文件操作流与函数

    一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...

随机推荐

  1. redis的数据类型和指令

    1.全局key操作: 测试指令: 全局key操作命令:忽略与key关联的value的类型 删 flushdb 清空当前选择的数据库 del mykey mykey2 删除了两个 Keys 改 move ...

  2. C#接口和抽象类的区别

    大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料.      一.抽象类:      抽象类是特殊的类,只是不能被实例化:除 ...

  3. Angular 2 - 5 分钟快速入门

    原文地址: https://angular.io/docs/ts/latest/quickstart.html 让我们从 0 开始创建一个简单的 Angular 2 应用. 下载任何版本的 angul ...

  4. ubuntu16.04装MatConvNet

    按matconvnet官网上的步骤来,编译代码的时候会发现编译失败. 参考这条issues 以下是我的解决方案: I use ubuntu16.04 with x64 architecture. I ...

  5. java 跨平台 数据类型 修饰符 程序结构

    java跨平台的实现: .java文件 ——编译(javac)——> 二进制字节码的.class文件 ——不同平台的虚拟机(JVM)——>对应硬件平台可执行的代码 java数据类型的划分: ...

  6. Java开发11个过不去的梗

    现在随着编程的普及,作为java程序猿开发的过程逐渐的受到领导的重视,无论自己的经理是能看懂,还是不能看懂,一些事项必须注意起来,不要让自己将来处于不尴不尬的境地,当然这样也方便你我他 1.不在属性文 ...

  7. [Unity3D]添加音效说明

    添加音效组件并添加音乐资源 其中Pitch用来提高和降低音调的,比如可以和赛车游戏的轮胎绑定,当轮胎越快,则音调越高 2D/3D音效:2D音效和摄影家的距离无关,可以看做是一个背景音乐:而3D音效则是 ...

  8. [Unity] 导出Android APK包出错

    确认Android环境是OK的. 检查 StreamingAssets 目录下是否有中文的文件名 检查其它目录的中文文件名. 移除一些插件再试.

  9. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  10. 什么叫session和cookie-及其设置

    http的无状态? 保持状态, 是指当程序关闭后重启, 上一次操作的历史还能继续, 保持的. 如word中的 "选项"设置. 如windows系统的设置等等. http的设计目的, ...