PHP字符串的编码问题

    大家都知道,不同字符编码,其在内存占用的字节数不一样。如ASCII编码字符占用1个字节,UTF-8编码的中文字符是3字节,GBK为2个字节。

    PHP 也自带几种字符串截取函数,其中常用到的就是 substr 和 mb_substr。

    使用substr截取中文字符时会出现乱码,这是因为substr是按字节来截取的。即UTF-8编码的中文,使用substr截取,只会截取1/3个中文,当然出现乱码了。

    mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )  中的参数$encoding可以指定编码,如果省略,则使用内部字符编码。  

     如果不清楚字符串的编码格式的话,可以用mb_detect_encoding检查:

    $encoding  = mb_detect_encoding($string, array("ASCII",'UTF-8′,"GB2312′,"GBK",'BIG5′)); 

     然后:

     mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

    如果自己实现mb_substr,效率并不是很好。

编码相关的php函数使用

ord(substr($str, $i, 1)) > 0xa0)

ord($string)返回字符串第一个字符的ASC码,通过这个来判断截取的字符串第一个字符是不是汉字,因为例如gb2312编码的一个文字是2字节,utf8为三个字节。即   编码大于256的就是汉字

正则字符:

匹配汉字 :   preg_match_all('/[\x80-\xff]?./', $string, $match);  

匹配英文: preg_match_all("/[/x01-/x7f]+/", $string, $match);  

编码转换

iconv ( string $in_charset , string $out_charset , string $str )

 如GB2312  转UTF-8:  iconv("GB2312","UTF-8",$text)

url 编码urlencode

编码后返回的字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。

不过应该注意的是,在编码时应该只对部分URL编码,否则URL中的冒号和反斜杠也会被转义。

URLEncode的方式一般有两种,一种是传统的基于GB2312的Encode,另一种是基于UTF-8的Encode。 如:

$url = '中国';  
echo urlencode($url );  
//UTF-8: %E4%B8%AD%E5%9B%BD  
//GB2312:%D6%D0%B9%FA

http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=16&rsv_sug=0&rsv_sug4=302&rsv_sug1=11&inputT=22928例如我们使用浏览器打开百度,搜索 “中国”.    在地址栏看到:

即我们看到“中国”被浏览器自动转换为:%E4%B8%AD%E5%9B%BD。

urlencode和rawurlencode的区别:urlencode将空格编码为加号“+”,rawurlencode将空格编码为加号“%20”。 

url解码urldecode 和 rawurldecode

1、在解码时,可以使用相应的 urldecode() 和 rawurldecode(),相应地,rawurldecode() 不会把加号('+')解码为空格,而 urldecode() 可以。

2、urldecode() 和 rawurldecode() 解码出的字符串是 UTF-8格式的编码,如果URL中含有非UTF-8 编码的中文,则要把解码出的字符串进行转换。

如下,先把php文件设置为gb2312编码。你会看到一部分是乱码,一部分是正常的。

$url = '中国';
echo $a = urldecode(urlencode($url)) ,' ';
echo iconv('gb2312', 'utf-8', $a);

�й� 中国

转自:http://blog.csdn.net/hguisu/article/details/7839478

原创文章,作者:s19930811,如若转载,请注明出处:http://www.178linux.com/2754

(0)
上一篇 2015-10-22 09:12
下一篇 2015-10-22 09:13

相关推荐

  • Linux常用命令

    一、Linux常用命令(总) 二、Linux常用命令(分) 1、pwd – print name of current/working directory 2、cd – change directory 3、ls – list,dieplay directory content 4、date – pr…

    Linux干货 2016-09-19
  • Linux的任务计划

    Linux的任务计划         我们在使用系统的过程中,经常需要在以后的某个时间点执行一个任务,而我们又不在机器旁边的时候,比如在半夜时服务器访问的用户很少,宽带资源很充足的时候,要去镜像软件包、重启服务器(虽然Linux很稳定)等,或者需要服务器在每天的特定时间去备份数据…

    2017-03-19
  • Linux上文件管理命令、元素据及时间戳、bash的工作特性回显和命令展开、定义别名,命令引用。

    文件管理命令: mkdir 创建空目录 语法: mkdir [选项]…目录… 选项: -P:逐层创建目录。 -v:显示过程。 -m:直接给定权限。 注意:路径的基名为命令作用对象。基名路径必须存在。 示例 创建/tmp/x1/a/a1和/tmp/x1/b rmdir 移除空目录 语法 rmdir [选项]…目录&#8230…

    Linux干货 2017-12-10
  • N22-网路班-第2次作业-冥界之王

    1.linux上文件管理类命令都有哪些,其常用的使用方法极其示例演示。(1).创建目录格式:mkdir [选项]  目录功能:创建目录常用选项说明: -m  创建目录的同时设置访问权限 -p  一次性创建多级目录 -v  显示过程[root@Cent…

    Linux干货 2016-08-22
  • N22+北京+张zhangzhang+第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who | cut -d" " -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 id `who | cut -d" " -f1 | tail -1` 3、取出当前系统上被用户当作其默认shell的最多的…

    Linux干货 2016-09-05
  • 走向了一条不归路 – – 开始

    前言:很高兴在这里认识大家,跟大家一起学习一起进步。  基础知识 1.计算机系统的组成 2.计算机的体系结构 3.存储网络 DAS–直接连接存储   (数据块)   存储设备与主机的紧密相连       1.管理成本较低,实施简单   &…

    2017-07-16