PHP字符串的编码问题的详细介绍


Posted in PHP onApril 27, 2013
 
    大家都知道,不同字符编码,其在内存占用的字节数不一样。如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);
�й� 中国

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(4)
Oct 09 PHP
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
php利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
PHP生成随机用户名和密码的实现代码
Feb 27 PHP
php 地区分类排序算法
Jul 01 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
php+html5基于websocket实现聊天室的方法
Jul 17 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
php正则表达式使用的详细介绍
Apr 27 #PHP
基于PHP编程注意事项的小结
Apr 27 #PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 #PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 #PHP
php 模拟get_headers函数的代码示例
Apr 27 #PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 #PHP
php笔记之:php函数range() round()和list()的使用说明
Apr 26 #PHP
You might like
Php部分常见问题总结
2006/10/09 PHP
解析php利用正则表达式解决采集内容排版的问题
2013/06/20 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
php无限极分类实现方法分析
2019/07/04 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
在Django的URLconf中使用命名组的方法
2015/07/18 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
合同协议书格式
2014/04/18 职场文书
出国英文推荐信
2014/05/10 职场文书
发布会邀请函
2015/01/31 职场文书
微信搭讪开场白
2015/05/28 职场文书
羊脂球读书笔记
2015/06/30 职场文书
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis