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中的foreach函数
Aug 31 PHP
php判断类是否存在函数class_exists用法分析
Nov 14 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
Sep 22 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP getDocNamespaces()函数讲解
Feb 03 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
PHP框架性能测试报告
2016/05/08 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
pandas 空的dataframe 插入列名的示例
2018/10/30 Python
Python中的取模运算方法
2018/11/10 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python global关键字的用法详解
2019/09/05 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
药剂专业自荐书
2014/06/20 职场文书
商务英语求职信范文
2015/03/19 职场文书
芙蓉镇观后感
2015/06/10 职场文书
学雷锋活动简报
2015/07/20 职场文书
门卫管理制度范本
2015/08/05 职场文书