php中str_split函數不支援中文分割,我們可以利用mb_xx函數實現
/**
* Convert a string to an array
* @param string $str
* @param number $split_length
* @return multitype:string
*/
function mb_str_split($str,$split_length=1,$charset="UTF-8"){
if(func_num_args()==1){
return preg_split('/(?<!^)(?!$)/u', $str);
}
if($split_length<1)return false;
$len = mb_strlen($str, $charset);
$arr = array();
for($i=0;$i<$len;$i+=$split_length){
$s = mb_substr($str, $i, $split_length, $charset);
$arr[] = $s;
}
return $arr;
}
方法二:
function mbStrSplit ($string, $len=1) {
$start = 0;
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string,$start,$len,"utf8");
$string = mb_substr($string, $len, $strlen,"utf8");
$strlen = mb_strlen($string);
}
return $array;
}
php "str_split"函數分割中文字串亂碼問題
問:
// 測試分割中文
$str2="輕輕地我走了,正如我輕輕的來。";
echo "原字串:<b>$str2.</b><br/>";
echo "1、以指定長度為5分割字串:<br/>";
$arr3=str_split($str2,5);
echo "--\$arr3[0]的值:"."$arr3[0]"."<br/>";
echo "--\$arr3[1]的值:"."$arr3[1]";
結果是:
原字串:輕輕地我走了,正如我輕輕的來。.
1、以指定長度為5分割字串:
--$arr3[0]的值:輕軾br/>--$arr3[1]的值:?地漯body>
亂碼!!求解釋,求真相!
答:
一個解決方案.
測試發現,preg_split對中文(多位元組)的分隔字元處理可能真的存在問題.
原因可能是正則匹配時不能正常分隔一個多位元組字元(猜測).
但我實驗用半形(英文)的分隔字元就工作得很好.
於是
我在處理待分隔的文本前先對文本進行替換,把中文的句點和逗號都替換成英文半形的.然後再使用preg_split,暫時發現工作得不錯.
以下是我的測試代碼.
<?php
$test = <<<EOF
記者從有關人士處獲悉,ECS Operations and Maintenance System二號發射的各項準備工作全部就緒,昨日經專家組評審,衛星、火箭、發射場、測控等系統均情況正常,具備發射條件。今天起,西昌衛星發射中心的加註手將為火箭加註燃料。
據一位航天專家介紹,因為地球和月球都在轉動的緣故,所以地月之間的最佳交匯點每年僅出現3次,而這3次便是發射探月衛星的最佳節點,經過觀測,今年3次的出現時間分別為10月1日、10月2日和10月3日,而最佳發射視窗則是1日晚7時,2日晚8時和3日晚10時,其中國慶日晚7時為佳中之佳。
針對媒體稱10月1日發射視窗時間為晚6時59分57秒,該專家告訴本報記者,早3秒並非提前3秒發射,而是將這3秒時間預留出來,作為現場指揮員在發送倒計時口令的緩衝時間。(記者萬強)
EOF;
//$input = $_POST[$content]; //........................擷取要分割的字串
$test = str_replace(",",',',$test);
$test = str_replace("。",'.',$test);
$mode="/[,|.]/s"; //......................用“逗號” 和 “句號” 分割字串
$output = preg_split($mode,$test,-1);
print_r($output);
?>
============
樓主不防試試,My Code是gb2312的字串.
經測試在,字串為UTF8時,也可以正常工作.