PHP字符串的编码问题的详细介绍

大家都知道,不同字符编码,其在内存占用的字节数不一样。如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);

�й� 中国

(0)

相关推荐

  • PHP字符串的编码问题的详细介绍

    大家都知道,不同字符编码,其在内存占用的字节数不一样.如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 $lengt

  • UTF-8编码问题BOM详细介绍

    今天在写php代码的时候,出现一个特郁闷的问题那就是两个一模一样的文件,在IE下显示有一个文件却出显了一个空白行,如地址所示http://www.kuomart.com/blog/my_ex/bom_utf8.htm以上出现空白行的页面是用php的require('t.htm')导入模板输出的,而我的php文件和htm文件都是用的记事本写的,然后保存为utf-8编码的,这样之后就出现了用nodepad保存utf8文件自动添加bom到文件的开始,起先自己测试用nodepad,dw,edplus打开

  • Python中字符串格式化str.format的详细介绍

    前言 Python 在 2.6 版本中新加了一个字符串格式化方法: str.format() .它的基本语法是通过 {} 和 : 来代替以前的 %.. 格式化时的占位符语法: replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" "映射"规则 通过位置 str.format() 可以接受不限个参数,位置可以

  • 深入jaxb xjc编码问题的详细介绍

    平时喜欢根据写一个xjc批处理命令,根据xsd批量生成java类,觉得很方便也很酷.但是有时候xsd生成的java类中含有汉字,结果总是有些问题.可是xjc命令参数又没有encoding参数之类的.在网上搜了一通,忽然发现了一个好东东:xjc是由com.sun.tools.internal.xjc.Driver实现的,因此批处理命令可以如下:java -Dfile.encoding=UTF-8 -cp D:\java\jdk1.6.0_03\lib\tools.jar com.sun.tools

  • IOS 字符串常用处理详细介绍

    IOS 字符串常用处理详细介绍 NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB]; 2,字符转int int intString = [newString intValue]; 3,int转字符 NSString *stringInt =

  • Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). 一.JSON字符串转换为JSON对象: eval() 和 JSON.parse eg- js

  • Python字符串与正则表达式详细介绍

    目录 一.字符串相关操作 二.正则表达式相关操作 一.字符串相关操作 1.统计所输入字符串中单词的个数,单词之间用空格分隔.其运行效果如下图所示. s=input('请输入字符串:') sum=1 for i in s:     if i==' ':         sum+=1 print('方法一:',end='') print('其中的单词总数有:',sum)   list=s.split(' ') print('方法二:',end='') print('其中的单词总数有:',len(li

  • Java字符串编码知识点详解介绍

    在 Java 中,当我们处理String时,有时需要将字符串编码为特定字符集.编码是一种将数据从一种格式转换为另一种格式的方法.字符串对象使用 UTF-16 编码.UTF-16 的问题在于它不能被修改.只有一种方法可以用来获得不同的编码,即 byte[] 数组.如果我们得到意外的数据,编码的方式是不合适的.在本节中,我们将学习如何在Java中对字符串进行编码. 在继续本节之前,我们必须了解字符编码.让我们快速浏览一下.让我们了解为什么我们需要对字符串进行编码. 字符编码是一种将文本数据转换为二进

  • javascript编码的几个方法详细介绍

    escape定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 参数 描述 string 必需.要被转义或编码的字符串. 返回值 已编码的 string 的副本.其中某些字符被替换成了十六进制的转义序列. 说明 该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / .其他所有的字符都会被转义序列替换. 提示和注释 提示:可以使用 unescape() 对 escape() 编码的字符

  • python request 模块详细介绍

    request Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作. GET 请求 # 1.无参数实例     import requests     ret = requests.get('https://github.com/timeline.json')     print

随机推荐