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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
分享PHP入门的学习方法
Jan 02 PHP
MySQL数据源表结构图示
Jun 05 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
PHP双向链表定义与用法示例
Jan 31 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
PHP开发实现快递查询功能详解
Apr 08 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连mysql和oracle数据库性能比较
2006/10/09 PHP
Banner程序
2006/10/09 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
用javascript实现画板的代码
2007/09/05 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python 字符串追加实例
2019/07/20 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
计算机专业自我鉴定
2013/10/15 职场文书
招商业务员岗位职责
2013/12/16 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
环境工程专业自荐信
2014/03/03 职场文书
给市场的环保建议书
2014/05/14 职场文书
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
Django中session进行权限管理的使用
2021/07/09 Python
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技