『壹』 在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函數擴展的。