酷!學園
技術討論區 => 程式討論版 => PHP程式設計討論區 => 主題作者是: yes298 於 2008-03-12 17:29
-
原本在Linux上開發的php程式移到FreeBSD 7.0 (x64),
發現 iconv() 失效, 我寫了個非常簡單的a.php去測試
由繁體轉為簡體, php沒有顯示有任何錯誤, 可以執行,
但就只有 “繁” 字能在gb2312編碼中顯示, “體”則不見了 ….
怎會這樣, 請求各位大大指點一下, 謝謝 ~
$a = "繁體";
$b = iconv('big5','gb2312',$a);
echo 'TC: ' . $a .'<br>';
echo 'SC: ' . $b .'<br>';
-
應該是字型的問題吧..... :o
-
跟字型有關?
不是的, 我已再三測試, 只有繁簡相同的字可以轉換, 只要遇到一個不能轉換便終止
-
改用 mbstring 裡面的轉換試試看吧....
-
學長, 若改為mbstring(), 工程會較大 ....
用phpinfo()看了一下, iconv()是enabled
iconv support enabled
iconv implementation libiconv
iconv library version 1.11
Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1
我是用port安裝的:
cd /usr/ports/lang/php5 && make install FORCE_PKG_REGISTER="yes" clean
cd /usr/ports/lang/php5-extensions && make install FORCE_PKG_REGISTER="yes" clean
但偏偏就不能轉換, 請求幫助 ~
-
libiconv 的版本不同? 使用的 table 不同? 自己在 shell 跑 iconv 轉看看吧.
自已弄個 table 來轉會比較保險些. (google 找一下應該就有類似的 table 可以用)
-
原本在Linux上開發的php程式移到FreeBSD 7.0 (x64),
發現 iconv() 失效, 我寫了個非常簡單的a.php去測試
由繁體轉為簡體, php沒有顯示有任何錯誤, 可以執行,
但就只有 “繁” 字能在gb2312編碼中顯示, “體”則不見了 ….
怎會這樣, 請求各位大大指點一下, 謝謝 ~
$a = "繁體";
$b = iconv('big5','gb2312',$a);
echo 'TC: ' . $a .'<br>';
echo 'SC: ' . $b .'<br>';
在裡面加上一行
echo md5($b).'<br>';
看看dump出來的md5值是不是下面的這串
7b617746d7aaaec3cda3de12d5aaa8bf
如果是的話問題就不在iconv上了
而是你的client端字形有問題顯示不出來嘍
-
按樓上學長的建議, 是顯示: 0c926a289dea5a196e94efbac04118ae
而不是7b617746d7aaaec3cda3de12d5aaa8bf, 我確定是php的iconv()問題
用phpinfo()看了一下, iconv()是enabled
iconv support enabled
iconv implementation libiconv
iconv library version 1.11
Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1
再 用 var_dump(get_extension_funcs("iconv")); 看了一下, 卻不知錯在哪裡:
array(11) { - => string(5) "iconv" [1]=> string(16) "ob_iconv_handler" [2]=> string(18) "iconv_get_encoding" [3]=> string(18) "iconv_set_encoding" [4]=> string(12) "iconv_strlen" [5]=> string(12) "iconv_substr" [6]=> string(12) "iconv_strpos" [7]=> string(13) "iconv_strrpos" [8]=> string(17) "iconv_mime_encode" [9]=> string(17) "iconv_mime_decode" [10]=> string(25) "iconv_mime_decode_headers" } [/color]
經過再三的測試, 發現用iconv():
(1) 若果是繁体字 --> GBK , 则直接显示繁体字,
(2) 不論php的iconv()或者直接在FreeBSD上用指令iconv都只能將gb2312或big5转换为utf8,
(3) gb2312或gbk就不能與big5進行互相的轉換, 即使用mb_convert_encoding()亦是这样 ...
我的環境: FreeBSD 7.0 (x64), PHP v5.2.5, Apache v2.2
己給此問題困擾多天了, 誠心請求各位學長指點一二, 萬分感謝,
-
我是覺得,山不轉路可轉 , 不用執著於一定要用PHP的function call吧 ?
用system去呼叫外部的iconv程式來轉換也是一種暫時性的辦法吧? 試看看能否順利轉換
能用的話,先頂一下,問題慢慢找解決的辦法!!
-
連直接用 iconv 指令都是錯的, 怎麼會認為是 php 的問題呢? php 也是直接去呼叫 libiconv 的函式, 並沒有其他任何的處理.
請去檢查 libiconv 的版本與內部所用的對照 table 吧.
-
學長, 該如何去檢查 libiconv 的版本與內部所用的對照 table ?
能否給個詳盡的步驟, 我亦覺得是FreeBSD的libiconv出現了問題 .....
感謝不盡 ...
-
http://www.gnu.org/software/libiconv/
一般的系統可能把 libiconv 包在 libc 裡頭. 也許要看 glibc 的 source code.
http://cle.linux.org.tw/xcin/i18n/pc2000/p4/node3.html
這兒有提到 gconv-modules 的部份, 要做 big5 與 gb2312 的轉換要有轉換表, 也許 freebsd 沒有編入這個部份.
其實要跨平台, 比較保險的作法, 是自己弄一份轉換表吧. google 一下就可以找到別人做好的可以用了.
-
FreeBSD 比較機車,請把 encode 改成大寫的 BIG5、GB2312 :D
-
樓上學長, 你是說:
$b = iconv('big5','gb2312',"繁體學業");
變為
$b = iconv('BIG5','GB2312',"繁體學業");
沒有用的, 是FreeBSD的libconv有問題, 不能進行繁簡互換 ...
-
我知道是怎麼回事了,Linux上GNU libc的 gconv 會把繁體轉成簡體,但是FreeBSD上面的GNU libiconv不會進行這種轉換。
-
hum....
連table裡都找不到的字怎麼轉換?
並不是所有的字都有對應的
所以,換個解決方案吧...
system call autogb 轉如何?