2011-08-26 35 views
-1

我想一些幫助,我的網站沒有顯示喜歡E的某些字符, - ,等等等等。重音和其他非ASCII字符不顯示在網頁上

我已經tryed這種方法來獲得他們

function UTFeer($v) { 

    //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? 
    $v = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.'|[\x00-\x7F][\x80-\xBF]+'. '|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. '|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. '|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', '?', $v); 

    //reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? 
    $v = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. '|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $v); 

    return $v; 
} 

我的數據庫是來自wordpress,現在我不再使用wordpress,而是海關係統從db中獲取數據。 可以請一些一個扶,有關如何顯示在網站的所有文字.. 謝謝

編輯:我現在用的,這個代碼,它似乎工作,但就是這個代碼「重」的網站?

function normalize_special_characters($str) 
{ 
    # Quotes cleanup 
    $str = ereg_replace(chr(ord("`")), "'", $str);  # ` 
    $str = ereg_replace(chr(ord("´")), "'", $str);  # ´ 
    $str = ereg_replace(chr(ord("„")), ",", $str);  # „ 
    $str = ereg_replace(chr(ord("`")), "'", $str);  # ` 
    $str = ereg_replace(chr(ord("´")), "'", $str);  # ´ 
    $str = ereg_replace(chr(ord("「")), "\"", $str);  # 「 
    $str = ereg_replace(chr(ord("」")), "\"", $str);  # 」 
    $str = ereg_replace(chr(ord("´")), "'", $str);  # ´ 

$unwanted_array = array( 'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 
          'Ê'=>'E', 'Ë'=>'Ë', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 
          'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 
          'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'ë', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 
          'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y'); 
$str = strtr($str, $unwanted_array); 

# Bullets, dashes, and trademarks 
$str = ereg_replace(chr(149), "•", $str); # bullet • 
$str = ereg_replace(chr(150), "–", $str); # en dash 
$str = ereg_replace(chr(151), "—", $str); # em dash 
$str = ereg_replace(chr(153), "™", $str); # trademark 
$str = ereg_replace(chr(169), "©", $str); # copyright mark 
$str = ereg_replace(chr(174), "®", $str);  # registration mark 

    return $str; 
} 
+1

爲您的數據庫設置正確的編碼,用於您的數據庫連接,在您的元標記的http標頭中。最後,確保你的瀏覽器檢測到正確的編碼 – knittl

+1

'的mysql_query(「集名稱‘UTF8’」);'關鍵字這裏是PHP的MySQL UTF8 – Prix

+1

你從哪裏得到你所引用的代碼,誰告訴你這將是適當的你的問題?根據評論,它旨在刪除_illegal_和_unwanted_ UTF-8序列。對於已經格式良好的數據(並保留在BMP中),它不應該做任何事情。 –

回答

1

這聽起來像您的數據可能使用了錯誤的字符編碼可以得到保存。例如,數據庫可能將文本存儲爲Latin-1,但在存儲文本之前不會將用戶輸入轉換爲Latin-1(因爲Latin-1是單字節字符集,所以MySQL無法區分),所以無論它得到可能有效)。

應用程序數據拉回來了數據庫中顯示的時候,有沒有知道的人物實際上是如何編碼的方式。通常情況下,這將與在content-type標頭中天真地聲明UTF-8字符編碼相結合,這會導致您可能稱之爲「WTF-8編碼」。

如果你有MySQL服務器的文件系統訪問,添加以下/etc/my.cnf

[mysqld] 
init_connect='SET collation_connection = utf8_general_ci' 
init_connect='SET NAMES utf8' 
default-character-set=utf8 
character-set-server=utf8 
collation-server=utf8_general_ci 
skip-character-set-client-handshake 

一旦你做出這種改變,你將需要重新啓動服務器上的mysqld服務。

您可以驗證這一點通過手動連接到MySQL服務器,併發出以下命令工作:

SHOW VARIABLES WHERE `Variable_name` LIKE 'character_set%' OR `Variable_name` LIKE `collation_%'; 

你應該看到的東西,看起來像這樣:

 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | utf8      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
| collation_connection  | utf8_general_ci   | 
| collation_database  | utf8_general_ci   | 
| collation_server   | utf8_general_ci   | 
+--------------------------+----------------------------+ 

你是雖然沒有完成,但是;這僅爲未來創建的任何數據設置默認字符集/排序規則。現有數據未被轉換。

修復現有的數據是不是一個特別容易的事,因爲你可能在使用不同的字符編碼保存的每個表中不同的行。

雖然有幾種方法可以實現。也許在這裏工作的一種方法是每一個文本列轉換爲blob,然後將其轉換回text(或varchar等;將其轉換回是你做了它blob之前的類型),這將迫使MySQL試圖修復字符編碼:

ALTER TABLE `(table name)` MODIFY `(column name)` BLOB; 
ALTER TABLE `(table name)` MODIFY `(column name)` TEXT CHARACTER SET utf8; 

有關更多信息,請參閱this article

+0

日Thnx了很好的答案,我看到,該表是:字符集UTF8和整理utf8_general_ci,在數據庫中的文字就像我希望它是,但是當它在網頁中顯示,新行缺少,IDK的怎麼樣被調用,但是當我按下回車,在數據庫顯示,我已經輸入預設並有一個新行,其中pharagraph應該開始,但在我的網站,它不顯示新的行,這是奇怪的,任何解決方案?最好的問候 – Meo

+0

嘿@Meo。對不起,花了這麼久回到你身邊。這可能是很好的材料,新的問題,因爲它聽起來像一個稍微不同的問題(所有文字消失,而不是具體的實體不渲染),我們會希望有一個更深入的看,是以用戶的代碼輸入並將其保存在數據庫中。 – 2011-08-26 21:06:06

+0

你能否確認,則不僅表有正確的字符集/校對,但做的varchar /文本列呢? – 2011-08-26 21:06:53