網路城邦

上一篇 回創作列表 下一篇   字體:
UTF-8轉BIG5方式與錯誤修正
2010/01/15 17:09:33瀏覽12919|回應0|推薦1
基本上現在許多網站、論壇、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('?','?'); ,裡面應該是全型空白字元,
但是張貼出去後,變成問號,表示那二個空白字元應該是比較特別的
( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=maxmas&aid=3690155