mbphp
‘壹’ 在php中,为什么使用mb
mb打头的函数,都最新添加的,好多要求php5版本
处理速度能更快,功能更强大一些
但也有一些默认是未被开启
没有非说得用mb函数的说法,合适的就是最好的
比如说mb_substr用来截取中文时不会把一个汉字截断的现象
substr更适合截取英文内容
但php默认是不支持的,需要在配置中解开
;extension=php_mbstring.dll
‘贰’ php以mb开头的函数是什么意思
i18n_http_input mb_http_input() 多字节字符串函数
i18n_http_output mb_http_output() 多字节字符串函数
i18n_internal_encoding mb_internal_encoding() 多字节字符串函数
i18n_ja_jp_hantozen mb_convert_kana() 多字节字符串函数
i18n_mime_header_decode mb_decode_mimeheader() 多字节字符串函数
i18n_mime_header_encode mb_encode_mimeheader() 多字节字符串函数
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
‘叁’ 有关php的mb_substr()
下面这样检测是否具备条件:
<?php
if (function_exists('mb_string')) echo ('mb_string可用');
else echo ('mb_string 不可用');
?>
不具备条件的时候,一个一个的字符检查,如果ASC码大于0xa0就是半个汉字,同时移动到下一个字符,网上许多这样的例子,我网络一下出来两万多个网页,而且第一个网页里面就有我们需要的东西,地址是:http://hi..com/zys1234/blog/item/b840c612ceb03657f819b88e.html
‘肆’ 如何让php 支持mb
找到php安装目录下的php.ini 打开, 里面有一句:
;extension=php_mbstring.dll
将前面的分号;去掉, 重启一下服务器就行了
‘伍’ php中怎么判断支持mb
PHP判断支持mb,我不太清楚,建议你去后盾网看看,半天讲课半天练习,哪里不会看哪里
‘陆’ php 中的mb_strlen 与 strlen 哪个跟javascript 中的length 相同,如果不同应该怎么改的相同
额~ 如果是字符串长度的话 mb_strlen 和 Js 的 length 相同。
strlen是字符串长度,但是其实可以说是字节长度,因为PHP还不支持unicode,所以对于多字节字符没法通过strlen正确的取得长度。如果编码是gbk的话,一个汉字的长度是2, 如果是utf-8的话,一个汉字的长度一般是3,也可能不是,这个按照编码区间来区分。
如果要出里多字节字符字符串的话,就要用PHP 的一个 mb 扩展,mb族包含了一系列函数,可以去PHP 手册看http://www.php.net/manual-lookup.php?pattern=mb&lang=en&scope=quickref
我也表达不是很明白。建议你网络或者google 一下 Unicode、ASCII、UTF-8、GBK~ 都看一下,就很明白了。PHP和JS支持的编码不一样,所以很多不一样。
有问题可以Hi我。
‘柒’ 求问一个php的mb_substr()截取字符出现的问题
这是浏览器的编码设置问题。考虑通过Php的函数header设置页面编码。例如:
header('Content-Type: text/html; charset=gb2312');
‘捌’ PHP中strlen()和mb_strlen()的区别浅析
在php中常见的计算字符串长度的函数有:strlen和mb_strlen.当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。
先来看一个例子:
复制代码
代码如下:
<?php
//测试时文件的编码方式要是UTF8
$str='中文a字1符';
echo
strlen($str).'<br>';//14
echo
mb_strlen($str,'utf8').'<br>';//6
echo
mb_strlen($str,'gbk').'<br>';//8
echo
mb_strlen($str,'gb2312').'<br>';//10
?>
结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6。
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)
复制代码
代码如下:
echo
(strlen($str)
+
mb_strlen($str,'UTF8'))
/
2;
例如:“中文a字1符”
的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10:
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。
对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。
采用mb_strlen函数可以较好地解决这个问题。
mb_strlen的用法和
strlen类似,只不过它有第二个可选参数用于指定字符编码。
例如得到UTF-8的字符串$str长度,可以用mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过mb_internal_encoding()函数得到。
注意:
mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll
即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。
‘玖’ php 里 mb_convert_encoding()函数,
不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。
mb_convert_encoding的用法见官方:
http://cn.php.net/manual/zh/function.mb-convert-encoding.php
做一个GBK To UTF-8
复制代码代码如下:
<?php
header("content-Type: text/html; charset=Utf-8");
echo mb_convert_encoding("你系我的友仔", "UTF-8", "GBK");
?>
再来个GB2312 To Big5
复制代码代码如下:
<?php
header("content-Type: text/html; charset=big5");
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
?>
不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。
PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。
下面还有一些详细的例子:
iconv — Convert string to requested character encoding
(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding
(PHP 4 >= 4.0.6, PHP 5)
用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;
string iconv ( string in_charset, string out_charset, string str )
注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。
Returns the converted string or FALSE on failure.
使用:
发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.
一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.
from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.
/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);
/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
$str = mb_convert_encoding($str, “EUC-JP”, “auto”);
例子:
复制代码代码如下:
$content = iconv("GBK", "UTF-8", $content);
$content = mb_convert_encoding($content, "UTF-8","GBK");
PHP中使用mb_convert_encoding转码的小陷阱
在php程序中使用mb_convert_encoding()方法进行字符编码转换大家都很熟悉了,平时也在大量的使用。而且在一般情况下该方法也表现的足够好,值得表扬。但在一个项目中我们需要使用它进行UTF8到GBK的转换,在转换一些特殊字符时发现了一个不大不小的问题。具体表现为mb把在utf8可编码的字符而在gbk中不可编码的字符都转成了\0x00\0x80,这样就导致转换后的gbk字符是有问题的。
在我们的意识中,在进行字符编码转换的过程中,如果遇到目标编码不可表现的字符,转码程序应该做的是舍弃这种字符,这样虽然丢失了部分数据,但不会导致转码的字符序列不可用。不清楚mb为什么要使用上述方式而不是舍弃方式。
临时的解决方式是对转码后的字符串序列进行过滤,过滤掉所有\x00\80的字符;又或者在转义之前对utf8的字符串进行过滤,过滤掉ut8可表示而gbk不可表示的所有字符,从实现难度上来讲,第一种过滤方式比较容易做到。
‘拾’ 问题是:在PHP中,为什么使用mb_strlen()函数报错
用phpinfo()查看一下mb扩展是否已经正确安装,木有的话,检查你的php.ini文件里的mb的dll或者是Unix下安装php的configure的时候是否添加相关配置。一般Unix下默认是添加mb函数扩展的。