PHP中文截取,UTF8和GBK详解
中文字符截取是一个十分有用的功能,在很多地方都会用到,比如提取定长标题,抽取标签等
由于各种字符集的存储方式的不一样,存在双字节(GBK)多字节(Unicode)的存储方式,这就导致了统一处理的困难。
国际标准UTF8字符编码中,存储中文字符要3个字节,即把php文件存储为UTF8编码格式可以得到
strlen("中")=3
假如直接用php的字符串函数去处理类似这个字符将可能产生乱友的情况,主要是由于在一个完整字符中间强制截断产生半字符的情况。要避免这种情况的唯一办法就是把截断位置延长到这个字符结束的位置进行截断
在PHP中,提供了mbstring模块功能,mbstring以字符作为操作的基本单元,如mb_strlen("中","utf-8")=1
。
大部分的mbstring都要求输入编码,当然可以在php环境中设置默认的编码。参数设置为mbstring.internal_encoding
= UTF-8, mbstring.http_input = UTF-8, mbstring.http_output =
UTF-8, mbstring.substitute_character =
UTF-8。由于php系统一般是存储字节来计算长度的,为了消除mbstring和string之间的差异,使用mbstring的时候就要格外小心
了。
假如不使用mbstring的功能 的话,可以自行编写中文字符处理的函数。
php中文截取函数,经网上搜索学习发现,大部分网络中都是以从开始位置一个一个完整字符来实现的。这有可能导致效率十分底。下面我写了个截取函数,是针对UTF8的
<?php
$str = "d中-在f在你是d我的国家困g在有和,人。工";
var_dump(strcut($str,0,9));
function strcut($str,$start,$len){
if($start < 0)
$start = strlen($str)+$start;
$retstart = $start+getOfFirstIndex($str,$start);
echo $retstart;
$retend = $start + $len -1 + getOfFirstIndex($str,$start + $len);
echo $retend;
return substr($str,$retstart,$retend-$retstart+1);
}
//判断字符开始的位置
function getOfFirstIndex($str,$start){
$char_aci = ord(substr($str,$start-1,1));
if(223<$char_aci && $char_aci<240)
return -1;
$char_aci = ord(substr($str,$start-2,1));
if(223<$char_aci && $char_aci<240)
return -2;
return 0;
}
?>
224-239是UTF8中文字符高位(第一位,共三位)ascii区间,换算成十六进制为0xE0 - 0xEF 二进制为1100 0000 - 1100 FFFF。通
相关文档:
日期格式化date()函数的格式化字符:
Y 年,4位数字
m 月,前面带0:"01"-"12"
d 月中的天
H 时,24时制
i 分
s ......
PHP有很多机制、函数,其实就是魔术师,重复发挥好,其实甚至是简单应用,就会出现神奇的效果。这里讲一个ob_start()函数。
ob_start()函数用于打开缓冲区,比如header()函数之
前如果就有输出,包括回车\空格\换行\都会有”Header had all ready send
by”的错误,这时可以先用ob_start()打开缓冲区PHP代码的数� ......
在为用户提供动态内容方面,PHP和MySQL是一个强大的组合。这些年来,这两项产品已经跨越了它们最初的应用舞台,现在,一些世界上最繁忙的网站也在应用它们。虽然它们当初都是开源软件,只能在UNIX/Linux上运行,但经过相当一段时期的发展,它们已能在Windows平台上运行。
在本文中,我将逐步为你们说明如何在Windows环境中 ......
<?php
class useful{
/*
* 常用函数类
* 作 者:多菜鸟
* 联系邮箱:kingerq AT msn DOT com
* 创建时间:2005-07-18
* 来源:http://blog.csdn.net/kingerq
*/
/*
* 功能:格式化数字,以标准MONEY格式输出
......
pack/unpack的摸板字符字符含义
format 参数的可能值:
a - NUL-padded string
A - SPACE-padded string
h - Hex string, low nibble first
H - Hex string, high nibble first
c - signed char
C - unsigned char
s - signed short (always 16 bit, machine byte order)
S - unsigned short (always 16 bi ......