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 相关文章推荐
phpmyadmin里面导入sql语句格式的大量数据的方法
Jun 05 PHP
mac下使用brew配置环境的步骤分享
May 23 PHP
PHP 第二节 数据类型之数组
Apr 28 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP接入支付宝接口失效流程详解
Nov 10 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集成百度Ueditor 1.4.3
2014/11/23 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue项目中使用AES实现密码加密解密(ECB和CBC两种模式)
2019/08/12 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
浅谈python 类方法/静态方法
2020/09/18 Python
Python 实现一个简单的web服务器
2021/01/03 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
捐资助学感谢信
2015/01/21 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Redis三种集群模式详解
2021/10/05 Redis
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python