大家都知道,不同字符编码,其在内存占用的字节数不一样。如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。 如:
  1. $url = '中国';
  2. echo urlencode($url );
  3. //UTF-8: %E4%B8%AD%E5%9B%BD
  4. //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字符串的编码问题(转)的更多相关文章

  1. Python字符串的编码与解码(encode与decode)

    首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unico ...

  2. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  3. 中文字符串的编码转换(c实现)

    中文字符串在c/c++中表示为字节序列,在分词的时候需要根据不同的编码方式进行分词,一般分词器需要转换成统一的编码方式再进行转换,有些分词器如ICTCLAS在分词的时候可以不显示定义编码方式,可以检测 ...

  4. java转换字符串的编码(转)

    package com.Alex.base; import java.io.UnsupportedEncodingException; /** * 转换字符串的编码 */ public class C ...

  5. python入门(9)字符串和编码

    python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...

  6. python笔记二(数据类型和变量、编码方式、字符串的编码、字符串的格式化)

    一.数据类型 python可以直接处理的数据类型有:整数.浮点数.字符串.布尔值.空值. 整数 浮点数 字符串:双引号内嵌套单引号,可以输出 i'm ok. 也可以用\来实现,\n 换行 \t tab ...

  7. python基础——字符串、编码、格式化

    1.三种编码:ascii Unicode utf8 2.字符串和编码数字的两个函数:ord(字符转数字ord(‘A’)=65)和 chr(数字转字符chr(65)=A) 3.bytes存储编码,记住两 ...

  8. c# 对html字符串进行编码

    /// <summary> /// 对html字符串进行编码 /// </summary> /// <param name="html">htm ...

  9. python教程1:Python基础之数据类型和变量、字符串和编码

    视频链接:http://www.bilibili.com/video/av10730372/ 我是在Linux下玩python的,Linux下默认安装python,直接打个pyhon3就好了,pyth ...

  10. JavaScript escape() unescape() decodeURI()函数对字符串进行编码解码

    定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(string) 参数 描述 string 必需.要被转义或编码的字符串. 返回值 已 ...

随机推荐

  1. WindowsServer2012 取消密码策略

    1.打开“组策略管理”界面:管理工具 >> 组策略管理,如果找不到该功能,则需要先安装,在“服务管理器”里面“添加新功能”.(或者:开始——运行——gpmc.msc) 2.依次打开“林”& ...

  2. strcmp和==比较

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/cpp_strcmp.html #include <stdio.h> # ...

  3. 标准SQL语言的用法

    原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...

  4. django 学习 --- 环境搭建

    1 安装django a: pip安装 pip install Django==版本号 b:源码安装 https://www.djangoproject.com/download/ tar -xvzf ...

  5. 转 jQuery(图片、相册)插件代码实例

    jQuery想必大部分前端er都知道甚至很熟悉了,网上有数以万计的优秀的jQuery插件以及教程,今天收集了一些关于图片.相册的jQuery插件代码,希望会对你有所帮助. 1. 3D Gallery ...

  6. Python3 如何优雅地使用正则表达式(详解四)

    更多强大的功能 到目前为止,我们只是介绍了正则表达式的一部分功能.在这一篇中,我们会学习到一些新的元字符,然后再教大家如何使用组来获得被匹配的部分文本. 更多元字符 还有一些元字符我们没有讲到,接下来 ...

  7. sunJCE or ibmJce,was服务器下使用des的注意点

    最近开发了一个应用,在tomcat下一切ok,到was上有报错. 打开debug日志,没有异常?? 继续调查发现是我们的程序引用了一个sun很久以前的jar.这个jar需要单独打开message日志 ...

  8. c语言输入一行未知个数数字存入数组

    一直有个疑问输入一行数字存入数组时若不知道数字的个数怎么办,最容易想到的办法就是接收字符然后转化为数字,但这样太过麻烦. 今天上网查了下,说可以用ungetc()函数将字符送回输入流,在这里总结归纳一 ...

  9. 发布项目到 Linux 上运行 Core 项目

    发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...

  10. Win10使用小技巧

    Win10技巧4.命令行支持Ctrl+V 这项功能使用的人不多,但绝对是跨时代的,因为你终于可以放心大胆地在命令提示符里使用Ctrl+V来粘贴剪贴板内容了.而在此之前,Ctrl+V换来的结果只是一个^ ...