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正则的Unknown Modifier错误解决方法
Mar 02 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
drupal 代码实现URL重写
May 04 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
Aug 14 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
php HTML无刷新提交表单
Apr 05 PHP
php基于websocket搭建简易聊天室实践
Oct 24 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
PHP+原生态ajax实现的省市联动功能详解
Aug 15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 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
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
JavaScript简介
2015/02/15 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
python使用cookielib库示例分享
2014/03/03 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
技能比赛获奖感言
2014/02/14 职场文书
触电现场处置方案
2014/05/14 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
欢迎领导检查标语
2014/06/27 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
小型婚礼主持词
2015/06/30 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书