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抓即时股票信息
Oct 09 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP折半(二分)查找算法实例分析
May 12 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 29 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实现的封装验证码类详解
2013/06/18 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python 多线程不加锁分块读取文件的方法
2018/12/11 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
绩效专员岗位职责
2013/12/02 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
消防安全员岗位职责
2014/03/10 职场文书
大学专科自荐信
2014/06/17 职场文书
离婚协议书范文2014
2014/10/16 职场文书
导游词格式
2015/02/13 职场文书
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python
Python中itertools库的四个函数介绍
2022/04/06 Python
bose降噪耳机音能消除人声吗
2022/04/19 数码科技