UTF-8 顯示問題

edited 十月 2013 in 資料庫
各位大大:

我有一個 UTF-8 編碼的 MySQL 資料庫,裡面存有一些資料,
想要用 php 將資料讀出並顯示在網頁上,但是顯示出來的資料
都是亂碼,請問有什麼方法可以正常的讓 php 顯示 UTF-8 的
資料。

MySQL:5.0.15
PHP:5.0.5
Platform:Window 2000

請各位大大,不吝指教,
謝謝。

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1351

評論

  • edited 三月 2006
    你的網頁是utf-8寫的嗎?
    在網頁開頭加這一行試試看
    @header('Content-Type: text/html; charset=utf-8');
  • edited 三月 2006
    感謝 zeppelin 大大的回覆,

    我的網頁不是用 UTF-8 寫的,是用 dreamweaver 寫的,
    有一些網頁可以輸入資料到我的 UTF-8 資料庫,然後再由
    網頁讀出資料是可以正常顯示的,但是這次無法顯示的資料
    是透過 JDBC 的方式寫進到我的 UTF-8 資料庫,所以我覺的
    很奇怪,不知有沒有人知道要怎麼修改才可以讓網頁顯示正
    常的資料,謝謝。

    註:
     1. MySQL 的 UTF-8 資料庫,所存進去的資料不是都可會
       變成 UTF-8 的編碼嗎?這樣的話不管是從網頁輸入而存
       入資料庫的資料或是透過 JDBC 存入資料庫的資料不都
       應該會是一樣的,這樣我用同一個網頁在顯示資料時不
       也應該都可以正常顯示才對。(除非我的觀念錯誤)
     2. 上述兩種輸入方式的資料,若用 phpmyadmin 讀取的話,
       都是正常可顯示的,所以我才會認為不管是用什麼樣的輸
       入方式,只要我的網頁顯示的編碼是 UTF-8 的,應該就可
       以顯示 UTF-8 的資料才對。

    以上希望有那位大大可以幫忙指教一下,感激不盡,謝謝。
  • edited 三月 2006
    如果你要顯示的介面並非使用 utf-8 ,可以試試
    htmlentities($string, ENT_QUOTES, 'UTF-8');
    
    看看能否顯示。

    只是建議顯示介面與資料庫的編碼盡量一致會比較好。
  • edited 三月 2006
    感謝 kiang 大大的指教。

    我試了把整個 .php 檔轉成 UTF-8 的編碼格式,
    但我的資料還是無法正常顯示,後來發現應該是
    php 的 mysql funciton 的問題,不知那位大大
    知道如何正常的把資料從 UTF-8 編碼的 MySQL 資
    料庫中抓取出來。

    我覺的是 php 的 mysql function 有問題的原因如下:
     1. .php 的顯示網頁以 BIG5 編碼, 使用 php 的 iconv
       及 kiang 大大所建議的 htmlentities 方式顯示 UTF-8
       編碼的字,一開始會顯示成亂碼(因為IE的編碼是big5),
       但改成 utf-8 時,字就顯示正常了。
       若將 .php 的顯示網頁以 UTF-8 編碼,則一開始顯示
       就是正常的字(當然.php裡所設的編碼為utf-8)。
       .php 裡顯示的字的程式碼如下:
       echo iconv("BIG5","UTF-8","這是測試");
     2. 當我把 echo iconv("BIG5","UTF-8","這是測試"); 改
       成echo iconv("BIG5","UTF-8",$row_QueryRecordset1);時,
       不管 .php 的顯示資料網頁的編碼是 big5 or utf-8 都無法
       正常顯示。
    根據以上兩點,我才會覺的是 mysql 的 funcion 在把資料讀出
    時就將編碼改掉了,導致顯示資料的網頁都無法正常顯示。

    不知我的認知對不對,請知道是什麼原因或是知道怎麼修改的
    大大不吝指教,感激不盡,謝謝。
  • edited 三月 2006
    可以看看這篇討論:
    http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1301&forum=33

    有可能是連線時的編碼設定不正確造成,不過我沒有真的使用過 MySQL 5.x ,所以實際的狀況要你試試才知道。
  • edited 三月 2006
    感謝 kiang and tokimeki 兩位大大的指教,

    我的問題已經解決了,
    我所做的動作如下:
     1. 在 php 執行 query 前先執行 SET NAMES UTF8,然後再執行
       我所想要 query 的指令。
     2. 然後再使用 php 的 iconv function 將所查詢出來的資料轉成
       Big5 然後再顯示在網頁上。

    做第 2 個動作是,這樣就不用將我所寫的 php 一一轉成 UTF-8 的
    格式,因為我沒有好用的 UTF-8 的文字編輯器且要轉的 php 檔滿
    多的。:P

    再次感謝所有指教的大大們,謝謝。
  • edited 三月 2006
    SET names big5 對你來說會更好,不必用 iconv 轉碼~
  • edited 三月 2006
    支援UTF-8的編輯器阿,我推薦EmEditor...

    如果你輸出的網頁要用Big-5編碼的話,我個人建議你用ob_iconv_handler來做,這樣比較快...
  • edited 三月 2006
    感謝 Darkhero and tokimeki 兩位大大的指教,

    關於 Darkhero 大大所建議的 SET names big5,
    目前已經修改了,而且又不需用 iconv 做轉換,少
    了一行 code 又變得比較快一點,感謝。

    關於 tokimeki 大大所推薦 EmEditor,目前已下載
    使用中,還好有 free 的版本且 free 的版本已夠我
    目前所需,感謝。
    至於 ob_iconv_handler 我試了,網頁會正常顯示
    中文,但 Apache's error.log 裡會有 error 產生,
    我所做的動作如下:
     1. 在 php 裡加入:
      iconv_set_encoding("internal_encoding", "UTF8");
      iconv_set_encoding("output_encoding", "BIG5");
      ob_start("ob_iconv_handler");
      這三行指令,顯示的方式還是用 echo $String;

      在 Apache 的 error.log 中查到的訊息是:
      PHP Notice: Unknown: Wrong charset, conversion from `UTF8' to `BIG5' is not allowed in Unknown on line 0

      不知為何會有這樣的 error?

    這兩種方式都滿好用的,速度也都很快,
    再次感謝兩位大大的指教,謝謝。
      
  • edited 三月 2006
    把這行
    iconv_set_encoding("internal_encoding", "UTF8");
    改成
    iconv_set_encoding("internal_encoding", "UTF-8");
    試試看...
  • edited 三月 2006
    感謝 tokimeki 大大的指教,

    設成 UTF-8 是我最早的設定,設好之後,網頁無法顯示任何東西,
    在 Apache's error.log 裡會有:
     PHP Notice: Unknown: Detected an illegal character in input string in Unknown on line 0
    的錯誤訊息,我才把 UTF-8 改成 UTF8,這樣網頁可以正常顯示中
    文但是 Apache's error.log 裡會有:
     PHP Notice: Unknown: Wrong charset, conversion from `UTF8' to `BIG5' is not allowed in Unknown on line 0
    的錯誤訊息,或是把 BIG5 改成 BIG-5,我也試過改才小寫的,但
    結果還是如上面的情況,會出現上述的兩種錯誤訊息。

    我查不出那有問題,設法是參照 PHP 的手冊。
  • edited 三月 2006
    那改用mbstring系列的函數試試看...
    我個人其實比較推薦的是mbstring,因為他對應的函數比較多。
    至於Apache的log,我個人很少看...
  • edited 三月 2006
    感謝 tokimeki 大大的指教,

    我試了用 mbstring 的函數,結果只對網頁的文字有作用(可正常),
    對從 MySQL 讀出來的資料一直顯示亂碼,我所做的動作如下:

     1. 在 php 裡加入:
       mb_http_output('BIG-5');
       mb_internal_encoding("BIG-5");
       ob_start('mb_output_handler');
       顯示資料用 echo $String;

       只有在上述參數都設成 BIG-5 時網頁的文字顯示正常(如:
       標題文字跟欄位名稱),但從 MySQL 讀出來的資料(echo
       $String)是不管參數設成 BIG-5 or UTF-8 顯示都是亂碼,
       且就算在顯示後去修改 IE 的編碼,不管設成 BIG-5 or
       UTF-8 讀出來的資料一樣是亂碼。

       感覺像是轉碼不正確,因為 Apache's error.log 沒有出現
       任何 error messages。

       最後就算在 php.ini 裡做設定,然後 restart Apache 結果
       還是一樣。

    或許 mbstring 所適用的是在於網頁上的輸出入資料轉碼,若是
    從 MySQL 讀出的資料在轉碼上可能會有轉碼不正確的問題,這
    是我自己覺的,不一定正確,還請多多指正,謝謝。
  • edited 三月 2006
    mb_internal_encoding("BIG-5");
    要改成
    mb_internal_encoding("UTF-8");
    而且要在第一個敘述執行。
  • edited 三月 2006
    感謝 tokimeki 大大的指教,

    我試了但是情況並無法完全解決顯示問題,
    我測試的情況如下:
     1. 在 php 裡加入:
       mb_internal_encoding("UTF-8");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;

       結果:網頁一樣顯示亂碼,且不管把 IE 的編碼設成 big5 or utf-8
          都是亂碼。Apache's error.log 沒有 error 產生。

     2. 在 php 裡加入:
       mb_internal_encoding("BIG-5");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;

       結果:網頁一樣顯示亂碼,且不管把 IE 的編碼設成 big5 or utf-8
          都是亂碼。Apache's error.log 沒有 error 產生。

     3. 在 php 裡加入:
       mb_internal_encoding("UTF-8");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;
       set names big5

       結果:網頁一樣顯示亂碼,且不管把 IE 的編碼設成 big5 or utf-8
          都是亂碼。Apache's error.log 沒有 error 產生。

     4. 在 php 裡加入:
       mb_internal_encoding("BIG-5");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;
       set names big5

       結果:網頁顯示正常。

     5. 在 php 裡加入:
       mb_internal_encoding("UTF-8");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;
       set names utf8

       結果:網頁顯示除從 MySQL 讀出的資料是正常外(echo $String),
          其他網頁標題跟欄位名稱皆為亂碼。

     6. 在 php 裡加入:
       mb_internal_encoding("BIG-5");
       mb_http_output('BIG-5');
       ob_start('mb_output_handler');
       顯示資料用 echo $String;
       set names utf8

       結果:網頁顯示除標題跟欄位名稱是正常外,從 MySQL 讀出的
          資料是亂碼(echo $String)。

    目前測試只有第 4 種情況是全部都顯示正常的,又在第 4 種情況下,
    只要有設 set names big5 網頁就可以顯示正常,所以目前為止還是
    搞不懂什麼情況下用 mbstring 是比較合適的。
    請不吝指教,感激不盡,謝謝。
  • edited 三月 2006
    這是因為你的PHP檔案的編碼格式是BIG-5的緣故,我一直以為你是存成UTF-8。
    set names 要跟著PHP檔案的編碼走,無論你在MySQL的表裡面是用甚麼編碼。
    原則上,以後這種混合編碼的問題我不再回答,原因請看:
    http://twpug.net/x/modules/smartsection/item.php?itemid=43
  • edited 三月 2006
    感謝 tokimeki 大大的指教,

    對於未能在問問題先爬過大大的文章,造成大大的不便,
    在此說聲抱歉,還請大大見諒。

    最後再次感謝 tokimeki 大大以及先前大大們的指教,謝謝。
Sign In or Register to comment.