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中利用XML技术构造远程服务(上)
Oct 09 PHP
文章推荐系统(二)
Oct 09 PHP
与数据库连接
Oct 09 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
56.com视频采集接口程序(PHP)
Sep 22 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
php ajax异步读取rss文档数据
Mar 29 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
Javascript学习指南
2014/12/01 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
python基础教程之基本内置数据类型介绍
2014/02/20 Python
python实现xlsx文件分析详解
2018/01/02 Python
django解决跨域请求的问题
2018/11/11 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
python随机模块random使用方法详解
2020/02/14 Python
python中id函数运行方式
2020/07/03 Python
浅析python 字典嵌套
2020/09/29 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
仓库班组长岗位职责
2013/12/12 职场文书
公积金单位接收函
2014/01/11 职场文书
主管会计岗位责任制
2014/02/10 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
节约粮食标语
2014/06/18 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
国庆节慰问信
2015/02/15 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android