2014-09-03 108 views
0

我在一個web應用程序中遇到了一個奇怪的問題。奇怪的PHP charset問題?

它是存儲關於金屬製品數據的應用程序,因此使用O形符號很多。 當我在Windows 7或我的Vista電腦上運行應用程序(都是32位)時,Ø被存儲爲Ø。 當我在Windows 8(64位)上運行應用程序時,Ø被存儲爲oslash;我不想要。

我在所有系統上使用的應用程序,阿帕奇,MySQL和PHP的版本相同。配置文件(httpd.conf和php.ini)和路徑一樣好(路徑除外)。

而且當我和我的Windows 8連接與在Windows 7的Vista中運行的應用程序,一切工作正常,O是存儲爲Ø。 反過來,使用Vista在Windows 8上運行應用程序,然後我得到oslash;

我的HTML頁面包含:

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

PHP頁面開始:

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

DB訪問:

mysql_query("SET NAMES UTF8"); 

和我用下面從HTML獲得價值PHP:

htmlentities($_POST[$name]); 

但是,這並不能真正成爲問題,因爲它適用於WIN7/Vista的

任何人有一個想法是什麼可能是這個問題,我該如何解決?

在此先感謝

+2

mysql與此無關。它將**從不**爲你做實體編碼。這不是它的工作。如果你用oslash取出oslash,那是因爲你首先把oslash塞進了mysql。 – 2014-09-03 18:44:06

+2

你應該只使用'htmlentities'和'echo'結合。不要在插入數據庫的值上使用它。 – GhostGambler 2014-09-03 19:20:18

回答

1

如果你問的HTML實體,正確的行爲是爲了獲得oslash;。錯誤的安裝是舊的,這個字符沒有被檢測爲必須被實體解碼。

現在,正如@GhostGambler在評論中所解釋的那樣,真正的問題是在將數據插入數據庫之前,您不需要請求html實體解碼版本的輸入

如果你這樣做了一個安全原因那麼你這樣做錯誤。規則是根據目的地篩選/轉義所有內容。

  • 當存儲在數據庫中的東西,您使用的所有東西都應該被過濾對SQL語言的濫用。
  • 當你在HTML頁面中輸出不同的是,您的動態用戶內容應針對HTML轉義
  • 相同的規則對於其他目的地,如JSON,CSV等

htmlentites是一個html逃避者,它防止任何奇怪的字符(如'<')被解釋爲HTML語法的真實字符部分。並且它還將具有特殊編碼的字符轉換爲html實體(如oslash;)以避免編碼問題。在安全性不那麼重要的第二項任務中,轉換後的字符列表可能會從一個PHP版本更改爲另一個版本。 您可以用功能get_html_translation_table測試轉換的字符這個名單:

var_dump(get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'WINDOWS-1252')); 
var_dump(get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'UTF-8')); 
(..) 

作爲一個方面說明,ヶ輛也可能與字符編碼參數一起使用的功能,如果你知道什麼是數據的編碼從數據庫加載:

htmlentities($str, ENT_QUOTES, "UTF-8"); 

你肯定會需要調用這個函數ヶ輛,但它應該只是HTML輸出前進行設置,也許對代碼的完全地不同的部分,在view一部分。

要在數據庫中使用它之前確保您輸入您還有其他的解決方案:

  • 使用parametized查詢中使用mysql_real_escape_string
  • (迄今爲止最好的)
  • (...)