簡體   English   中英

PHP/MySQL 編碼問題。 ★代替某些字符

[英]PHP/MySQL encoding problems. â�� instead of certain characters

使用 php 將某些字符輸入我的 mysql 數據庫時,我遇到了一些問題。 我正在做的是將用戶輸入的文本提交到數據庫。 我無法弄清楚我需要更改什么以允許將任何類型的字符放入數據庫並按預期通過 php 打印出來。

我的 MySQL 排序規則是:latin1_swedish_ci

在我將文本從我的表單發送到數據庫之前,我對數據使用了 mysql_real_escape_string() 。

下面的例子

本文:

�People are just as happy as they make up their minds to be.�
� Abraham Lincoln 

應該是這樣的:

“People are just as happy as they make up their minds to be.”
― Abraham Lincoln

正如其他人所提到的,如果要支持“特殊”字符,則需要從頭到尾轉換為 UTF8。 這意味着您的網頁、PHP、mysql 連接和 mysql 表。 該網頁相當簡單,只需使用UTF8 的meta 標記即可。 理想情況下,您的標頭也會顯示 UTF8。

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

將您的 PHP 設置為使用 UTF8。 事情可能無論如何都會起作用,但這是一個很好的措施:

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');

對於mysql,你想將你的表轉換為UTF8,不需要導出/導入。

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8

您可以而且應該將 mysql 配置為默認的 utf8。 但您也可以運行查詢:

 SET NAMES UTF8

作為建立連接后的第一個查詢,它將把你的數據庫連接“轉換”為 UTF8。

那應該可以解決您所有的字符顯示問題。

問題的最可能原因是數據庫連接設置為latin1 ,但您正在向它提供以 UTF-8 編碼的文本。 解決此問題的最簡單方法是將您的輸入轉換為客戶期望的內容:

$quote = iconv("UTF-8", "WINDOWS-1252//TRANSLIT", $quote);

(在世界其他地方,MySQL 稱為latin1的是 windows-1252。)請注意,許多字符,例如您在那里使用的引號破折號 U+2015,無法用這種編碼表示,將被轉換為其他字符。 理想情況下,您應該將列編碼更改為utf8

另一種解決方案:將數據庫連接設置為utf8 列的編碼方式無關緊要:MySQL 在內部將文本從連接編碼轉換為存儲編碼,如果需要,可以將列保留為latin1 (如果這樣做,引號破折號 U+2015 將變成問號?因為它不在latin1中)

如何設置連接編碼取決於您使用的是什么庫:如果您使用已棄用的 MySQL 庫,它是 mysql_set_charset,如果是 MySQLi,它是 mysqli_set_charset,如果是 PDO,則將encoding=utf8添加到 DSN。

如果您這樣做,您將使用 Content-Type 標頭將頁面編碼設置為 UTF-8。 否則你會遇到與瀏覽器相同的問題:當它期待其他內容時,向它提供以 UTF-8 編碼的文本:

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

如果從頭開始,所提供的解決方案會很有幫助。 把所有可能的連接都放到UTF-8確實是最安全的。 出於各種原因,UTF-8 是網上最常用的字符集。

一些建議和警告:

  • 使用唯一前綴 (tmp_)復制要清理的表
  • 盡管您的數據庫連接被強制為 utf8,請檢查您的常規設置排序規則,如果尚未完成,請更改為utf8_bin
  • 你需要在本地服務器上運行它
  • 有趣的字符錯誤主要是由於混合了 LATIN1 和 UTF-8 配置。 這個解決方案就是為此而設計的。 它可以與 LATIN1 的其他使用過的字符集一起使用,但我還沒有檢查過這個
  • 在復制回原始文件之前廣泛檢查這些 tmp_tables

構建魔法所需的 2 數組:

$chars = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, "UTF-8");
$LATIN1 = $UTF8 = array();
while (list($key,$val) = each ($chars)) {
    $UTF8[] = $key;
    $LATIN1[] = $val;
}

現在構建您需要的例程:(tables->)rows->fields 並在每個字段調用

$row[$field] = mysql_real_escape_string(str_replace($LATIN1 , $UTF8 , $row[$field]));
$q[] = "$field = '{$row[$field]}'";

最后建立並發送查詢:

mysql_query("UPDATE $table SET " . implode(" , " , $q) . " WHERE id = '{$row['id']}' LIMIT 1");

將 MySQL 排序規則更改為 utf8_unicode_ci 或 utf8_general_ci,包括表和數據庫。

您需要將數據庫設置為 utf-8 yes。 有很多方法可以做到。 通過更改配置文件,通過 phpmyadmin 或在插入和更新 mysql 之前調用 php 函數(抱歉內存空白)。

不幸的是,我認為您將不得不重新輸入之前輸入的所有數據。

根據個人經驗,您還需要知道一件事,確保所有具有關系的表都具有相同的排序規則,否則您將無法加入它們。

作為參考: http ://dev.mysql.com/doc/refman/5.6/en/charset-syntax.html

此外,我可以是 apache 設置。 我們在“免費托管”服務器和我兄弟的服務器上都遇到過同樣的問題。 一旦切換到另一個服務器,所有字符都變得整潔。 Verfiy 你的apache 設置,抱歉,但我無法詳細了解apache 的配置。

擺脫一切你只需要遵循這兩點,所有關於特殊語言字符的問題都會得到解決。

1- 您需要將表的排序規則定義為 utf8_general_ci。

2- 在 head 標簽后的 HTML 中定義<meta http-equiv="content-type" content="text/html; charset=utf-8">

2-您需要定義mysql_set_charset('utf8',$link_identifier); 在您與數據庫建立連接的文件中,在選擇數據庫(如“mysql_select_db”)之后立即使用此“mysql_set_charset”,這將允許您以任何語言正確添加和檢索數據。

如果您的文本已使用錯誤的編碼進行編碼和解碼,因此 mojibake 實際上被“固化”為 unicode 字符,那么到目前為止提到的解決方案將不起作用。 我最終成功地使用ftfy Python 包自動檢測/修復 mojibake:

>>> import ftfy
>>> print(ftfy.fix_encoding("(ง'⌣')ง"))
(ง'⌣')ง

希望這可以幫助處於類似情況的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM