2012-12-28 46 views
0

1)我有一個表tbl_Data在數據庫中有name列與文本比較方法(?)屬性設置爲utf8_polish_ci。作爲一種魅力,當我通過phpMyAdmin瀏覽tbl_Data來自PHP的錯誤編碼?

2)在我的HTML代碼,我有:

<!DOCTYPE HTML> 
<html> 
<head> 
<meta charset="UTF-8"> 

所以好像我發送的瀏覽器正確的編碼頭......

3)我的PDO DSN包含;charset=UTF-8,其次從PHP手冊。

4)在我的PHP代碼我使用:

foreach(parent::query('SELECT ID,PLName,LatinName from tbl_Data') as $row) { 
    $result = $result." 
     <tr> 
      <td>".utf8_encode($row['PLName'])."</td> 
     </tr> 
    "; 
} 

擁有這一切,我仍然得到「垃圾」(= ?)字符代替適當潤色信件,但其中一些顯示良好(phpMyAdmin正常顯示)。我在這裏錯過了什麼?請教,夥計們!

我的MySQL引擎是InnoDB,web服務器:nginx與FPM如果revelant ...

+1

你看到的[函數utf8_encode函數]在PHP手冊評論(http://php.net/manual/en/function.utf8-encode.php)?即:「如果你的文本已經在UTF-8中,你不需要這個功能」?如果你不使用'utf8_encode'函數會發生什麼? – Charlie

+0

如果我根本不使用這個函數,那麼我從早期使用'utf8_encode()'的「ó」接收到了 。其餘缺失的字母仍然是「?」 –

+0

maby這將幫助http://php.net/manual/en/function.htmlspecialchars.php – Ivo

回答

2

所以好像我正在爲瀏覽器發送適當的編碼標題。

錯誤。 <meta>不是HTTP標頭,而是HTML標籤,非標準標籤。所以,你的代碼仍然缺少適當的頭文件。

header('Content-Type: text/html; charset=utf-8'); 

我的PDO DSN包含;字符集= UTF-8,接着從PHP手冊。

如果您的PHP版本低於5.3.6,它也不會工作。使用SET NAMES utf8定期查詢,而不是

+0

對於標題()而言+1,基本線.. – Xfile

+0

我在我的'ob_start();'行後面添加了'header(...)'行,這些字符仍然不正確。唯一的區別是如果我使用'utf8_encode()'或不。如果代碼使用它,只有一個字母能夠正確顯示,如果不是它們都不是。 'php --version'給了我:'PHP 5.4.10(cli)(built:Dec 22 2012 22:12:36) Copyright(c)1997-2012 PHP Group Zend Engine v2.4.0,Copyright(c) )1998-2012 Zend Technologies' –

+0

雖然'SET NAMES utf8'做了竅門。謝謝! –

0

我不能在您的文章發表評論.....所以我建議這裏〜_〜
here,它說utf8_encode - 編碼一個ISO-8859-1字符串爲UTF-8
因此,我的問題是:您的輸出是ISO-8859-1嗎?
可能是你可以創建一個正常的英語測試記錄,然後再試一次。

+0

感謝您的建議,我已經添加了一個默認設置的測試列,並填充所有可能的波蘭語字母。 phpMyAdmin顯示效果很好,但網站顯示:'????? '' –

+0

正常英語怎麼樣,就像abcdefg? –

+0

英文作品很好 –

1

如果您的文本已經是UTF-8編碼,沒有理由使用utf8_encode()

潛在的問題可能是您的PHP版本。您的DSN的;charset=UTF-8元素僅受PHP版本> = 5.3.6的支持。 在5.3.6之前,這個元素被默默地忽略了(而不是發出警告)。更多信息和解決類似的問題在文檔可供選擇: http://php.net/manual/en/ref.pdo-mysql.connection.php

+0

'php - 版本'在cli給我:'PHP 5.4.10(cli)(內置:Dec 22 2012 22:12:36) 版權所有(c)1997-2012 PHP組 Zend引擎v2.4.0,版權所有(c)1998 -2012 Zend Technologies '所以它似乎應該工作... –

1

字符集UTF-8好(在你的HTML):P

試試這個。(使用新的,實驗桌關於這個問題,檢查出來,因爲我不知道你的PHP腳本是否清理$ _POST條目,或者做一些事情..)

  1. 創建列設置爲utf8_bin(不utf_ci_polish)命名爲 「polish_title」

  2. PHP傳遞(文字輸入,拋光)數據到mysql INSERT (or update)隱蔽那些在此之前(PHP集成)功能

    $ polish_input = 用htmlspecialchars($ input_polish_data);

    INSERT INTO TABLE_NAME(polish_title)值( '$ polish_input');

你會看到在mysql表奇怪的數據(通過phpMyAdmin的)時擦亮招牌是你輸入的一部分,什麼是正常的(或blobed),但好的(拋光本地)在您的網站,當你得到MySQL的數據出;)

如果要去工作,你的所有mqsql(文本)列應改爲utf8_bin。爲了方便你自己輸入,你可以創建一個函數,它可以在輸入到mysql數據庫之前「清除」你網站上的所有$ _POST輸入。

這個大好處是,來自其他國家的遊客將看到您的本地信&跡象(什麼也很重要)。

編輯(THX常理用戶輸入)

,是的還包括這是一個必須在頭

header('Content-Type: text/html; charset=utf-8'); 
+0

同樣的結果,哥們。只有一個字母顯示正確。 –

-1

在你的HTML代碼,請嘗試:

<meta http-equiv="content-type" content="text/html; charset=utf-8">