緣由:
最近因為裝了PHP7的緣故,又加上有一點點的閒,故研究PHP這塊。尤其是運算耗時方面,因為我本身就是要測試PHP7可以快到何種地步。聽說是快20倍的樣子。
結果,到最後我反而開始寫程式碼,昨天修正BBcode檢查的函數,運行約一萬字的代碼,結果速度慢到極致,被我修改後,倒加速不少,總速度提升82倍,原本12.3秒,修正到0.15秒(如果僅比較檢查BBcode的函數,加快上萬倍。),後來遇上了這個轉HTMLcode的問題,原先寫得太慢了,這是我第三次修正!
//目前我寫的最快的版本。
function string_to_utf16_ascii_HTML_new2($str){
$str=mb_convert_encoding($str, 'ucs-2', 'utf-8');
for($i=0;$i<strlen($str);$i+=2){
$str2.='&#'.str_pad((ord($str[$i])*256+ord($str[$i+1])),5,'0',STR_PAD_LEFT).';';
}
return $str2;
}
//稍慢的版本(舊版)
function string_to_utf16_ascii_HTML_new($str){
for ($i=0;$i<strlen($str);$i++){
$k=ord($str[$i]);
if ($k >= 192 and $k <= 223){
$k=$k-192;
$k2=ord($str[$i+1])-128;
$c=$c.'&#'.str_pad($k*64+$k2,5,'0',STR_PAD_LEFT).';';
}elseif ($k >= 224 and $k <= 239){
$k=$k-224;
$k2=ord($str[$i+1])-128;
$k3=ord($str[$i+2])-128;
$c=$c.'&#'.str_pad($k*4096+$k2*64+$k3,5,'0',STR_PAD_LEFT).';';
}elseif ($k >= 128 and $k <= 191){
}else{
$c=$c.'&#'.str_pad($k,5,'0',STR_PAD_LEFT).';';
}
}
return $c;
}
//極慢的版本(初版)
function string_to_utf16_ascii_HTML($str){
for ($i=0;$str[$i]!="";$i++){
$b[]=ord($str[$i]);
}
$str2=',';
for ($i=0;$str[$i]!="";$i++){
$xa=str_pad(decbin($b[$i]),8,'0',STR_PAD_LEFT);
if (substr($xa,0,3) == "110"){
$xb=str_pad(decbin($b[$i+1]),8,'0',STR_PAD_LEFT);
$xx1=substr($xa,3);
$xx2=substr($xb,2);
$c=$c.$str2.str_pad(bindec($xx1.$xx2),5,'0',STR_PAD_LEFT);
}elseif (substr($xa,0,4) == "1110"){
$xb=str_pad(decbin($b[$i+1]),8,'0',STR_PAD_LEFT);
$xc=str_pad(decbin($b[$i+2]),8,'0',STR_PAD_LEFT);
$xx1=substr($xa,3);
$xx2=substr($xb,2);
$xx3=substr($xc,2);
$c=$c.$str2.str_pad(bindec($xx1.$xx2.$xx3),5,'0',STR_PAD_LEFT);
}elseif (substr($xa,0,2) == "10"){
}else{
$c=$c.$str2.str_pad($b[$i],5,'0',STR_PAD_LEFT);
}
}
return substr($c,1);
}
//將HTMLcode轉回UTF-8字串。
function utf16_ascii_HTML_to_string($str){
return mb_convert_encoding($str, 'UTF-8', 'HTML-ENTITIES');
}
/********
使用方法:
*********
$str='這是測試123';
$encode_str=string_to_utf16_ascii_HTML_new2($str);
echo $encode_str;
//output:
//這是測試123
//以瀏覽器顯示,等同於「這是測試123」。
echo utf16_ascii_HTML_to_string($encode_str);
//output:
//這是測試123
*/