作者 主題: php的 iconv() 失效.  (閱讀 10306 次)

0 會員 與 1 訪客 正在閱讀本文。

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
php的 iconv() 失效.
« 於: 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>';


micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #1 於: 2008-03-12 17:54 »
應該是字型的問題吧..... :o

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #2 於: 2008-03-12 18:00 »
跟字型有關?

不是的, 我已再三測試, 只有繁簡相同的字可以轉換, 只要遇到一個不能轉換便終止

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
回覆: php的 iconv() 失效.
« 回覆 #3 於: 2008-03-12 18:21 »
改用 mbstring 裡面的轉換試試看吧....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #4 於: 2008-03-12 19:37 »
學長, 若改為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


但偏偏就不能轉換, 請求幫助 ~

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
回覆: php的 iconv() 失效.
« 回覆 #5 於: 2008-03-13 07:10 »
libiconv 的版本不同? 使用的 table 不同? 自己在 shell 跑 iconv 轉看看吧.

自已弄個 table 來轉會比較保險些. (google 找一下應該就有類似的 table 可以用)

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: php的 iconv() 失效.
« 回覆 #6 於: 2008-03-13 14:16 »
原本在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端字形有問題顯示不出來嘍
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #7 於: 2008-03-13 14:37 »
按樓上學長的建議, 是顯示: 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

    己給此問題困擾多天了, 誠心請求各位學長指點一二, 萬分感謝, 

anderson1127

  • 訪客
回覆: php的 iconv() 失效.
« 回覆 #8 於: 2008-03-13 16:48 »
我是覺得,山不轉路可轉 , 不用執著於一定要用PHP的function call吧 ?
用system去呼叫外部的iconv程式來轉換也是一種暫時性的辦法吧? 試看看能否順利轉換

能用的話,先頂一下,問題慢慢找解決的辦法!!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
回覆: php的 iconv() 失效.
« 回覆 #9 於: 2008-03-13 18:04 »
連直接用 iconv 指令都是錯的, 怎麼會認為是 php 的問題呢? php 也是直接去呼叫 libiconv 的函式, 並沒有其他任何的處理.
請去檢查 libiconv 的版本與內部所用的對照 table 吧.

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #10 於: 2008-03-14 08:01 »
學長, 該如何去檢查 libiconv 的版本與內部所用的對照 table ?

能否給個詳盡的步驟, 我亦覺得是FreeBSD的libiconv出現了問題 .....

感謝不盡 ...

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
回覆: php的 iconv() 失效.
« 回覆 #11 於: 2008-03-14 09:57 »
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 一下就可以找到別人做好的可以用了.

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
回覆: php的 iconv() 失效.
« 回覆 #12 於: 2008-03-14 10:14 »
FreeBSD 比較機車,請把 encode 改成大寫的 BIG5、GB2312  :D

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #13 於: 2008-03-14 10:33 »
樓上學長, 你是說:
$b = iconv('big5','gb2312',"繁體學業");
變為
 $b = iconv('BIG5','GB2312',"繁體學業");

沒有用的, 是FreeBSD的libconv有問題, 不能進行繁簡互換 ...



yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #14 於: 2008-03-15 08:11 »
我知道是怎麼回事了,Linux上GNU libc的 gconv 會把繁體轉成簡體,但是FreeBSD上面的GNU libiconv不會進行這種轉換。

梁楓

  • 俺是博士!
  • *****
  • 文章數: 6220
    • 檢視個人資料
回覆: php的 iconv() 失效.
« 回覆 #15 於: 2008-03-15 23:44 »
hum....
連table裡都找不到的字怎麼轉換?
並不是所有的字都有對應的

所以,換個解決方案吧...

system call autogb 轉如何?