GD輸出漢字的函式的分析

2022-10-06 15:09:23 字數 1244 閱讀 2673

很早以前找到乙個把gb碼轉化為utf-8的函式,配合乙個gbbpgnkxzk到unicode的對照表(gb2312.txt),用於在gd中輸出漢字。後來發現在欲輸出的內容中含有西文字元時,會出現混亂。後來找到了修改後的**,解決了問題。現將兩個函式做一對比分析如下。

首先,這是乙個unicode到utf-8編碼轉換的函式,這一部分修改前後沒有變化:

function u2utf8($c)

else if ($c < 0x800)

else if ($c < 0x10000)

else if ($c < 0x200000)

return $str;

}這裡完全是按照utf-8編碼的規則,通過判斷字元屬於不同的unicode編碼段範圍,進行不同的移位和位與操作,以轉化為utf-8編碼。關於該規則可參考http:/bpgnkxzk/www.utf8.org/上的說明。

這是修改前的gb轉化為utf-8編碼的函式,其中呼叫了上面的u2utf8函式。

function gb2utf8($gb)     /* program writen by sadly www.phpx.com  */

else

}$ret="";

for($i=0;$i$ret.=chr(substr($utf8,$i,3));

return $ret;

}函式中while迴圈部分,把漢字逐個按照「對照表」轉化為unicode,再通過u2utf8函式轉化為utf-8。但從中可以看出,while迴圈結束後,又用乙個for迴圈,把每三個位元組合成了乙個utf-8字元(見上的規則說明,每個漢字的utf-8編碼為三位元組),沒有考慮到其中的西文字元(西文字元的utf-8編碼為一位元組)。所以,如果欲輸出的內容中不論是開始時出現西文字元,或是漢字當中穿插西文字元,轉化為utf-8後,都會被按照「每三個位元組擷取」的方式截開,導致亂碼。

以下是修改後的函式:

function gb2utf8($gb)    /* program writen by sadly   modified by agun */

else

}return www.cppcns.com$ret;

}修改後的函式將 gb轉化為unicode、unicode轉化為utf-8、幾個位元組合成乙個utf-8字元,這三個步驟在乙個迴圈裡完成,尤其是幾個位元組合成乙個utf-8字元這一步驟,放在判斷了字元屬於西文還是屬於漢字的條件分支裡,據此決定擷取乙個位元組還是三個位元組。於是結果正確了!

本文標題: gd輸出漢字的函式的分析

本文位址:

cc 漢字的輸出

include using namespace std include include include system函式所需標頭檔案 define stoptimelong 500 sleep函式以毫秒為單位,sleep 500 表示停半秒 pragma warning disable 4996 中...

控制字典的輸出(漢字的解析)

通過這個修改,我們可以控制字典的輸出格式 修改的是系統的方法 重寫系統方法控制輸出 nsstring descriptionwithlocale id locale indent nsuinteger level 拼接key value self enumeratekeysandobjectsusi...

PHP的GD庫函式一覽

php的gd庫函式一覽 getimagesize 用法 array getimagesize string filename,array imageinfo imagearc 作用 畫弧線 用法 int imagearc int im,int cx,int cy,int w,int h,int s,...