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提取字符串中的图片地址[正则表达式]
Nov 12 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
PHP多线程类及用法实例
Dec 03 PHP
php简单备份与还原MySql的方法
May 09 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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生成月历代码
2007/06/14 PHP
php中动态修改ini配置
2014/10/14 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
小程序云开发实战小结
2018/10/25 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
视觉直观感受若干常用排序算法
2017/04/13 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
django基础学习之send_mail功能
2019/08/07 Python
Python socket聊天脚本代码实例
2020/01/02 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
先进个人获奖感言
2014/01/24 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
2015年新农合工作总结
2015/03/30 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python