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)
s19930811s19930811
上一篇 2015-10-22 09:12
下一篇 2015-10-22 09:13

相关推荐

  • 文本处理

    1 、查出分区空间使用率的最大百分比值   2、查出用户UID最大值的用户名、UID及shell类型   3、查出/tmp的权限,以数字方式显示   4、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序 5、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式) 6、显示/etc/passwd文…

    Linux干货 2016-08-08
  • 计算机的组成及其功能

    计算机的组成及其功能 计算机由五部分组成 运算器 实现算术运算和逻辑运算(和控制器组成CPU) 控制器 控制总线的使用权限,完成寻址和控制对内存当中的访问权限是做读访问还是写访问 存储器 内存,RAM(Random Access Memory) 输入(Input) 下指令,提供数据 输出(Output) 输出数据加工的结果

    2018-02-22
  • dstat,htop,top,ps命令 (Blog 8)

      Linux哲学思想之一:一切皆文件:内核将其参数全部映射为文件;这些文件保存在/proc, /sys目录中;/proc目录:保存内核及进程状态信息,是内核参数的映射; 内核参数:可调参数:调整运行特性;/proc/sys不可调参数:输出内核统计信息及状态信息; 进程状态:/proc/# 与进程号同名的目录,目录下存放许多当前进程相关信息; 进程…

    Linux干货 2017-11-27
  • N27—第十周作业

    N27_第十周作业 1、请详细描述Centos系统的启动流程(详细到每个过程系统做了哪些事情) 详情请参考http://www.178linux.com/85713 2、为运行于虚拟机上的Centos 6添加一块新的硬盘,提供两个主分区; (1)为硬盘新建两个主分区;并为其安装grub (2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供…

    Linux干货 2017-10-21
  • 懒人本地YUM源设置

    一、挂载本地光盘到根目录下/media。 [root@wing-PC ~]# mount -v /dev/sr0 /media/ 二、用mv 修改/etc/yum.repos.d下面的文件。 [root@wing-PC ~]# mv -v /etc/yum.repos.d/CentOS-Base.repo / CentOS-Base.repo.bak [ro…

    系统运维 2017-08-05
  • 编译安装lamp框架

    一、 先说说啥叫lamp     1. lamp简介: Linux Apache Mysql PHP(Python, Perl)的简称,下面说说他们之间的关系         Linux:系统运行平台    &…

    Linux干货 2015-06-18