2013-11-27 63 views
0

我試圖解決我的網站問題。如果我將包含£符號的表單提交到同一頁面,它甚至會在它到達我的數據庫之前回到£發佈值編碼問題。 £變成£

我試圖在我的標籤以下內容:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

<meta charset="utf-8"> 

我已經嘗試了所有的這些在每一頁的開頭:

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

我的數據庫連接字符串中也有SET NAMES

new PDO("mysql:host=localhost;dbname=########", "##########", "######", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

起初我還以爲是我的數據庫,因爲這些值在被存儲在那裏與這些價值 - 但我意識到,如果我提出我的表格,並有驗證錯誤,我通過拿起提交的值$_POST[]並且它返回帶有奇怪字符的文本框中的值。

它在我的本地WAMP服務器上工作得很好,但是當我在我的現場環境中運行我的網站時 - 這是我在編碼時遇到的問題。

有沒有人有任何其他建議,我可以嘗試解決它?

+3

您的PHP文件*保存*爲UTF-8嗎? – h2ooooooo

+0

我可以看到它被轉移爲'â ¬'。你使用'htmlentities'修復XSS?你確定使用'UTF-8'作爲參數#3嗎?我不知道你的PHP版本,但手冊指定:*與htmlspecialchars()類似,htmlentities()採用可選的第三個參數編碼,它定義了轉換中使用的編碼。如果省略,則此參數的默認值是5.4.0之前的PHP版本中的ISO-8859-1,PHP 5.4.0及之後的UTF-8版本。* – h2ooooooo

+0

您先生,祝您有一天!是的,我沒有在HTMLENTITIES()中包含編碼。現在我已經添加了它,顯示正常...我將把它放在一個函數中,然後現在使用它。隨意張貼,作爲答案,我會接受!謝謝soooooo多!我的WAMP服務器使用了更新版本的PHP,但是爲什麼它在我的本地而不是我的託管上工作。 – Luke

回答

1

你的問題是,您的在線服務器使用比5.4.0少了PHP版本,因此當您使用htmlentities則默認爲ISO-8859-1,爲manual規定:

像用htmlspecialchars( ),htmlentities()採用可選的第三個參數編碼,它定義了轉換中使用的編碼。如果省略,則此參數的缺省值是5.4.0之前的PHP版本中的ISO-8859-1,而PHP 5.4.0及之後的版本是UTF-8。

您可以通過使用UTF-8作爲第三個參數解決這個問題,或者乾脆讓自己的功能,默認它:

if (!function_exists('htmlentities_utf8')) { 
    function htmlentities_utf8($string, $flags = null, $encoding = 'UTF-8', $double_encode = true) { 
     if ($flags === null) { 
      $flags = ENT_COMPAT | ENT_HTML401; 
     } 

     return htmlentities($string, $flags, $encoding, $double_encode); 
    } 
} 

或者,如果你曾經計劃使用另一種編碼,可以使它抓住default_charset值:

if (!function_exists('htmlentities_dc')) { 
    function htmlentities_dc($string, $flags = null, $encoding = null, $double_encode = true) { 
     if ($flags === null) { 
      $flags = ENT_COMPAT | ENT_HTML401; 
     } 

     if ($encoding === null) { 
      $encoding = ini_get('default_charset'); 
     } 

     return htmlentities($string, $flags, $encoding, $double_encode); 
    } 
} 
+0

愛上第二個功能,我會使用它!謝謝! – Luke

+1

@Coulton我做了一個小小的改動(參數不能在它們中逐位,所以我把它放在了函數中)。 – h2ooooooo