打造典雅不凡的品味生活,專業丈量施工設計窗簾窗飾
包含各種窗簾布、捲簾等
搬家公司隔音窗、氣密窗,專營各式鋁門窗工程承包
依需求設計規劃,全方位為您隔絕噪音

首頁  •  j2h 論壇 • 程式設計討論     • 

[php] UTF-8轉BIG5方式與錯誤修正

房東:泰泰
發表時間:2012-02-05
[檢舉]


 

基本上現在許\多網站、論壇、Blog等等,大都已經使用UTF-8編碼,因為現在的作業系統,例如XP,已經可能打出繁體中文字碼(BIG5)與非繁體中文字碼的中文字(Unicode),

但很多人在打中文字時,因為不容易辨別,很容易用到Unicode的中文字,

如果在BIG5編碼的網頁上顯示,就會成為亂碼,存入BIG5編碼的資料庫內,

也會變成亂碼。

 

網路無國界,你的網站可能會有人輸入繁體中文、Unicode中文、簡體中文等,

如果像早期,那就網站看起來很多亂碼,很討厭,如果讓不同語言文字共存,

就是用UTF-8編碼,也解決中文字衝碼的問題。

 

但是有些時候還是會用到繁體中文編碼,所以要把UTF-8轉為BIG5,

一般我們使用的函數就是PHP內建的iconv(),不過如果被轉換內容裡面有特殊符號,

那麼轉換後,那個特殊符號後面的內容都會不見,如何能全部轉出來,

這裡用到iconv()內建的幾個參數。

 

用法:iconv ( string $in_charset , $out_charset , $str )

$in_charset  原來的編碼

$out_charset 要轉的編碼

$str 要被轉換的字串

 

範例:

 

$string = "ABBĀSĀBĀD";

 

echo iconv(\'UTF-8\', \'BIG5//TRANSLIT\', $string);

// 輸出: ABBASABAD

 

echo iconv(\'UTF-8\', \'BIG5//IGNORE\', $string);

// 輸出: ABBSBD

 

echo iconv(\'UTF-8\', \'BIG5//TRANSLIT//IGNORE\', $string);

// 輸出: 無

 

使用的方式有如上三種

//TRANSLIT

//IGNORE

//TRANSLIT//IGNORE

 

如果在第二個參數後面加上/ / TRANSLIT。

這意味著,當一個被轉換的字符不在被轉換的編碼裡面,則用一個或幾個類似的字符替代。

如果加上//IGNORE,當一個被轉換的字符不在被轉換的編碼裡面,就直接去掉。

 

大家可以自己用一小段含有Unicode的中文字串去測試,就會比較了解了。

 

另外特別提到一點,這是我碰過,花了一個多小時快變光頭時,

才找到的問題,在這邊分享經驗,希望後人遇到時不會像我一樣。

 

全型空格字元,大家都知道吧,可是你們不知道全型空格字元竟然有二種,

我跟大家一樣,原先以為只有一種,因為一般我們打全型空格字元,

真的就只是一種而已,可是我碰到二種,另一種我也不知道人家是怎麼打出來的,

在文字檔裡面,你看到的就是全型空格,沒有區分,這邊注意,

 

UTF-8編碼字串裡面如果有全型空格,在轉成BIG5碼時,在它後面的內容都會被截斷,

如果你用//IGNORE,那麼後面雖然都可以轉出來,但全型空格之後某一部分文字會變亂碼

 

所以我先用str_replace()函數把全型空格轉為HTML的十進制記號,

就是(?),這樣子就可以保留全型空格,但我只替換一部分的全型空格,

有一部分並沒有替換,我就是卡在這裡,測試來測試去,怎麼也想不通,

最後我用COPY的,把原檔案裡面轉換成功\與未轉換成功\的全型空格,

COPY到PHP程式裡,第一個參數可以使用陣列,如下:

 

        $ary_key=array(\'?\',\'?\');

        $contents = str_replace($ary_key,\'?\', $contents);

 

結果全部都轉換了,真怪,問題一定出在全型空格,打死我都不相信,

那二個有什麼不一樣,看上去都是全型空格,所以我用可以看Hex碼(即ASCII碼)的軟體,如Ultra Edit,把那二個空格貼上去,然後再切換成Hex碼介面,

哇∼見鬼,真的不一樣,一個是84 AA,另一個是84 AB,

但是表現出來的都是全型空格,媽呀∼真是太勁爆了

 

為了找出這個問題,我腦細胞不知道陣亡多少個.......

 

我猜測,或許\在TXT文字檔裡面打的全型空白字元,與在WORD檔裡面打的全型空白字元,

其內碼是不一樣的,猜測....,所以我在TXT裡面打個全型空白字元,貼到Ultra Edit,

然後在WORD裡面也打個全型空白字元,貼到Ultra Edit,結果二個的內碼一樣,

但竟然是A1 40,媽呀∼我不玩了,怎麼又多一種出來.......

 

然後我在Ultra Edit裡面打個空白字元,內碼也是A1 40,

所以A1 40的空白字元,才是我們在XP作業系統下會打出來的空白字元,

那我原先那個是怎麼打出來的?不想了,想破頭也沒用,全部加進去轉換吧...

 

註:上面的 $ary_key=array(\'?\',\'?\'); ,裡面應該是全型空白字元,

但是張貼出去後,變成問號,表示那二個空白字元應該是比較特別的





  • 贊助網站       

    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!
    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務



  •  共 0 人回應

    姓名:
    佈告內容: