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_Flame(Version:Progress)的原代码
Oct 09 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
Feb 04 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
php使用百度翻译api示例分享
Jan 31 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
php+mysql实现简单的增删改查功能
Jul 13 PHP
如何使用php实现评委评分器
Jul 31 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
php如何比较两个浮点数是否相等详解
Feb 12 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php获取根域名方法汇总
2014/10/28 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
js 居中漂浮广告
2010/03/21 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
使用vue-infinite-scroll实现无限滚动效果
2018/06/22 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
python 创建弹出式菜单的实现代码
2017/07/11 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
小区物业门卫岗位职责
2014/04/10 职场文书
家长通知书教师评语
2014/04/17 职场文书
物业保安岗位职责
2014/07/02 职场文书
颐和园英文导游词
2015/01/30 职场文书