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中文乱码问题。。。
Jan 18 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
May 20 PHP
laravel学习教程之存取器
Jul 30 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP实现常用排序算法的方法
Feb 05 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python中分数的相关使用教程
2015/03/30 Python
python遍历目录的方法小结
2016/04/28 Python
用python制作游戏外挂
2018/01/04 Python
Python函数生成器原理及使用详解
2020/03/12 Python
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
100%植物性、有机、即食餐:Sakara Life
2018/10/25 全球购物
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
应聘自荐信
2013/12/14 职场文书
难忘的一课教学反思
2014/04/30 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
护理学专业求职信
2014/06/29 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
目标责任书格式范文
2015/05/11 职场文书
写作技巧:优秀文案必备的3种结构
2019/08/19 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android