色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

UTF8下的中文PHP編程

瀏覽:3日期:2024-02-09 17:36:10

前言:

說(shuō)實(shí)話,涼鞋也覺(jué)得 UTF8 是好東西……畢竟同屏顯示中日韓對(duì)東亞人的吸引力是不小的……(當(dāng)然好處不僅是這點(diǎn)啦……)不僅是網(wǎng)頁(yè)程式……很多應(yīng)用程式的內(nèi)核都開(kāi)始使用 Unicode 編碼……目的是顯而易見(jiàn)的:支援多語(yǔ)言顯示……微軟的所有軟體都是 Unicode 內(nèi)核……所以日文軟體拿到你的中文 XP 上是可以正常顯示的……而中文 98 就會(huì)因?yàn)?GB 內(nèi)核安裝其他語(yǔ)言軟體時(shí)造成亂碼……

至于 UTF8 ,可以說(shuō)是 Unicode 的一個(gè)分支,它用三個(gè)字節(jié)保存一個(gè)漢字……(Unicode 用四個(gè)字節(jié))應(yīng)用軟體都集體投奔 Unicode 了……就不允許我們搞網(wǎng)頁(yè)程式的用 UTF8?

本文中涼鞋就盡量多方位介紹一下 UTF8 編碼下的 PHP 編程……至于為什么單獨(dú)介紹“中文”……一來(lái)是因?yàn)橛⑽倪@玩意實(shí)在不需要考慮 UTF8 ……除非你準(zhǔn)備做多語(yǔ)言系統(tǒng)……(我要發(fā)些牢騷:現(xiàn)在的老外寫程式時(shí)根本不重視這個(gè)問(wèn)題……)二來(lái)是中日韓等多字節(jié)語(yǔ)系在 UTF8 編碼下的處理方式其實(shí)大同小異……依葫蘆畫瓢即可……好……先從數(shù)據(jù)庫(kù)處理部分開(kāi)始吧……

==========================================連接數(shù)據(jù)庫(kù)

很多人剛升級(jí)到 Mysql 4.1 時(shí)會(huì)發(fā)現(xiàn)數(shù)據(jù)亂掉了……其實(shí)是因?yàn)?Mysql 從 4.1 開(kāi)始支援字符集了……而且默認(rèn)字符集正是 UTF8 ……(充分證明與國(guó)際接軌的重要性…… 嘿嘿……)而以前我們大多使用 utf8 或是 GBK 編碼……這樣以來(lái)輸出的數(shù)據(jù)當(dāng)然是亂碼……要解決亂碼……就得讓程序知道該獲取什么編碼的數(shù)據(jù)……

我們假設(shè)你以前的數(shù)據(jù)庫(kù)是 utf8 編碼的……那么你可以在查詢前添加一句

mysql_query('SET CHARACTER SET utf8') or die('Query failed : ' . mysql_error());當(dāng)然,由于 4.1 以上才需要這樣處理,因此我們可以加上判斷:

$mysqlversion = $db->query_first('SELECT VERSION() AS version');if ($mysqlversion['version'] >= '4.1'){mysql_query('SET CHARACTER SET utf8') or die('Query failed : ' . mysql_error());}這樣以來(lái)不管 Mysql 默認(rèn)編碼是什么都可以正常存取了……(不論您是存活期,還是存定期,甚至是零存整取都沒(méi)有問(wèn)題鳥(niǎo)……)

但是,人家都國(guó)際化鳥(niǎo)……您還在用 utf8 行么?如何轉(zhuǎn)碼呢?還有……數(shù)據(jù)升級(jí)時(shí)出現(xiàn)亂碼怎么辦?涼拌!且聽(tīng)下回分解……

============================================數(shù)據(jù)升級(jí)至 4.1

要升級(jí)……就得先導(dǎo)出……要說(shuō)老外還真不負(fù)責(zé)……以前的導(dǎo)出方式總是弄丟一些中文字符……比如把“我愛(ài)你娘”弄成“我愛(ài)你”啦……(通常是丟失一段數(shù)據(jù)最末尾的字)整個(gè)兒差了一輩兒……(用石榴姐的話說(shuō)就是“這么大逆不道的事實(shí)在是太刺激了”……)為了保護(hù)您脆弱的心臟……也為了維護(hù)中國(guó)傳統(tǒng)倫理道義……您可以把數(shù)據(jù)包含中文字符的字段改為二進(jìn)制(Binary)編碼……具體方法嘛……可以運(yùn)行這個(gè)語(yǔ)句:

ALTER TABLE `表名` CONVERT TO CHARACTER SET binary;這樣,那些字符類型字段,如:CHAR、VARCHAR 和 TEXT將轉(zhuǎn)換為BINARY、VARBINARY 和 BLOB然后再導(dǎo)出并導(dǎo)入到 4.1 環(huán)境中……當(dāng)然,最后一項(xiàng)繁瑣的工作是:你需要把它們的類型再改回來(lái)……

有往 4.1 升級(jí)的……當(dāng)然也有往下降級(jí)的……怎么降級(jí)???涼鞋去上個(gè)廁所……而您請(qǐng)翻下頁(yè)……

=============================================數(shù)據(jù)從 4.1 降級(jí)

有人發(fā)現(xiàn)從4.1導(dǎo)出的 SQL 文件無(wú)法導(dǎo)入低版本程序……問(wèn)題其實(shí)很簡(jiǎn)單……而且 Mysql 已經(jīng)為我們想好了一切……導(dǎo)出時(shí)請(qǐng)?zhí)砑?–compatible 參數(shù)……我們假設(shè)您的數(shù)據(jù)庫(kù)是 utf8 編碼的……而且目標(biāo)數(shù)據(jù)庫(kù)版本為 4.0 ……那么命令行下這么寫:

shell>mysqldump --user=username --password=password --compatible=mysql40 --default-character-set=utf8 database > db.sql這樣導(dǎo)出的 SQL 文件就能夠順利導(dǎo)入低版本數(shù)據(jù)庫(kù)了……

數(shù)據(jù)庫(kù)部分算是搞定了……但 PHP 編程方面要如何注意呢?還得勞您翻下頁(yè)……h(huán)ttp://www.mypchelp.cn=============================================PHP 文件編碼

是否所有 PHP 文件都必須轉(zhuǎn)成 UTF8 編碼呢?涼鞋告訴您是 NO ……

這么說(shuō)吧……如果文件中包含需要顯示出來(lái)的中文字符……就應(yīng)該轉(zhuǎn)為 UTF8 編碼……舉例子吧:

// 我是涼鞋echo time();上面的代碼雖有代碼……但是由于存在于注釋中……不會(huì)輸出……所以這個(gè)頁(yè)面可以不用轉(zhuǎn)換為 UTF8 格式……

再如:

echo '我是涼鞋';這個(gè)明顯有中文字符輸出……您還是老老實(shí)實(shí)轉(zhuǎn)換為 UTF8 吧……

當(dāng)然現(xiàn)在很多程式都采用模板(語(yǔ)言包)技術(shù)……程式(非語(yǔ)言包文件)里是看不到任何供輸出的字符的……這樣以來(lái)我們只需要將語(yǔ)言包文件轉(zhuǎn)成 UTF8 編碼即可……(語(yǔ)言包的優(yōu)勢(shì)就在這里啊…… 啊哈哈哈哈哈……)'http://www.mypchelp.cn==================================================

UTF8 中文截取

由于 UTF8 使用三個(gè)字節(jié)……所以傳統(tǒng)的 substr 函數(shù)就沒(méi)轍了……很多高手都寫了 UTF8 中文字符截取函數(shù)……這里送上幾種:

1.先算再取

/*** Author : Dummy | Zandy* Email : [email protected] | hotmail.com* Create : 200512* Usage : echo join('', String::subString_UTF8('漢字', 0, 1));*/ini_set('display_errors', 1);error_reporting(E_ALL ^ E_NOTICE);class String {function subString_UTF8($str, $start, $lenth){$len = strlen($str);$r = array();$n = 0;$m = 0;for($i = 0; $i < $len; $i++) {$x = substr($str, $i, 1);$a = base_convert(ord($x), 10, 2);$a = substr('00000000'.$a, -8);if ($n < $start){if (substr($a, 0, 1) == 0) {}elseif (substr($a, 0, 3) == 110) {$i += 1;}elseif (substr($a, 0, 4) == 1110) {$i += 2;}$n++;}else{if (substr($a, 0, 1) == 0) {$r[] = substr($str, $i, 1);}elseif (substr($a, 0, 3) == 110) {$r[] = substr($str, $i, 2);$i += 1;}elseif (substr($a, 0, 4) == 1110) {$r[] = substr($str, $i, 3);$i += 2;}else{$r[] = '';}if (++$m >= $lenth){break;}}}return $r;} // End subString_UTF8}// End Stringecho join('', String::subString_UTF8('漢字', 0, 1));2.先截后取這種方式?jīng)鲂X(jué)得很巧妙……用傳統(tǒng)截取函數(shù)先截?cái)唷缓笈袛嘀形膯蝹€(gè)字符是否被分割開(kāi)……如果是……則處理之……要特別注意的是 substr 函數(shù)的第三個(gè)參數(shù)必須大于 3 ……至于為什么不用涼鞋解釋了吧?

// A trim function to remove the last character of a utf-8 string// by following instructions on http://en.wikipedia.org/wiki/UTF-8// dotann// usage: $str = utf8_trim(substr($str,0,50));function utf8_trim($str) {$len = strlen($str);for ($i=strlen($str)-1; $i>=0; $i-=1){$hex .= ' '.ord($str[$i]);$ch = ord($str[$i]);if (($ch & 128)==0) return(substr($str,0,$i));if (($ch & 192)==192) return(substr($str,0,$i));}return($str.$hex);}$str = '漢字';echo utf8_trim(substr($str,0,3));3.還有其它方法,比如 007pig 為我們 vBulletin 中文版里所寫的函數(shù)……短小精悍……源碼不便放出……對(duì)不住鳥(niǎo)……

今天就寫到這里吧……還有轉(zhuǎn)碼等問(wèn)題沒(méi)有寫……最近忙……有空繼續(xù)整理……h(huán)ttp://www.quchao.com/?p=6&pp=1

標(biāo)簽: PHP
主站蜘蛛池模板: 九九九九精品视频在线播放 | 欧美日产国产亚洲综合图区一 | 国产综合在线观看视频 | 黄色片免费网址 | 国产精品成人免费观看 | 亚洲一区二区三区高清 | 成人亚洲在线 | 久久男人的天堂色偷偷 | 亚洲一级香蕉视频 | 国产日产欧产精品精品推荐在线 | 草草影院ccyycom浮力影院 | 亚洲一级黄色毛片 | 香蕉超级碰碰碰97视频蜜芽 | 一级欧美一级日韩 | 亚洲欧美日韩国产精品26u | 岛国搬运工最新网地址 | 国产一区二区三区日韩 | 日本一道免费一区二区三区 | 日韩午夜精品 | 欧美一级在线全免费 | 成人综合在线观看 | 精品国产成人高清在线 | 国产亚洲精品一区二区 | 在线久草视频 | 久久久久久免费播放一级毛片 | 美女拍拍拍爽爽爽爽爽爽 | 国产三级精品在线 | 久久亚洲欧洲日产国码 | 久草视频免费在线 | 欧美熟videos肥婆 | 国产大乳喷奶水在线看 | 中文字幕一二三区乱码老 | 精品一区二区三区四区在线 | 我要看一级大片 | 国产精品久久久久一区二区三区 | 日本波多野结衣在线 | 日韩免费观看一级毛片看看 | 国产人妖xxxx做受视频 | 亚洲区精品 | 欧美国产大片 | 欧美午夜a级精美理论片 |