[英]With PHP and MySQL, how do I properly write smart quotes to the database?
我有一個帶有CLEditor 富文本控件的 PHP 網站。 當我嘗試將歐元和英鎊寫入數據庫時,該字符運行良好,因為我在包含頁面 HTML、富文本控件 IFRAME HTML 和 MySQL 表排序規則中將字符集設置為 UTF-8。 在這方面一切都很好。 但是,當我嘗試編寫智能引號時,我最終會在數據庫中看到以下輸出:
This is a “testâ€.
(如果在您的瀏覽器上方沒有正確顯示,則測試詞的前面有拉丁語 a、歐元符號和小 AE 符號,后面是拉丁語 a 和歐元符號。 )
當我使用 PHP 從數據庫中讀取該值以將其顯示在頁面上時,它最終顯示為帶有問號的黑色菱形以及一些其他拉丁字符。
我應該怎么做才能解決這個問題?
首先,確保您的 MySQL 表使用 UTF-8 作為其編碼。 如果是,它將如下所示:
mysql> SHOW CREATE TABLE Users (
...
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 |
接下來,確保您的 HTML 頁面設置為顯示 UTF-8:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
....
</html>
然后它應該工作。
編輯:我故意不談論排序規則,因為我認為它已經被考慮過了,但是為了大家的利益,讓我在這個答案中添加更多內容。
你說,
我在 MySQL 表排序規則中將字符集設置為 UTF-8 ...。
Collation 是為了QUERYING 的目的自動嘗試將一個字符集轉換為另一個字符集的行為。 例如,如果您有一個 latin1 字符集和一個 UTF-8 排序規則,並且您執行類似 SELECT * FROM foo WHERE bar LIKE '%—%'; 之類的操作。 (UTF-8 U+2014) 在具有 latin1 字符集的表上匹配 L+0151或U+2014。
並非巧合……如果您將此 latin1 編碼字符輸出到 UTF-8 編碼網頁上,您將得到以下信息:
這是一個“測試”。
確切地說,這似乎是您的問題的輸出。 這是復制它的 HTML:
<?php
$string = "This is a “test”.";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf8"/>
</head>
<body>
<p><?php echo $string; ?></p>
</body>
</html>
確保將此文件保存在 latin1...
要查看您的表設置的字符集,請運行以下查詢:
SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T,
information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
AND T.table_schema = "database"
AND T.table_name = "table";
唯一適合您使用的結果(除非您使用多種非英語語言)是:
+--------------------+-----------------+
| character_set_name | TABLE_COLLATION |
+--------------------+-----------------+
| utf8 | utf8_general_ci |
+--------------------+-----------------+
感謝您的支持;-)
在打印任何內容之前,確保您的 PHP 文件在頂部有這個。 我可以將 latin_swedish_ci 帶入一個 utf8 編碼的網站,它可以正確編碼。
header("Content-type: text/html;charset=UTF-8");
我也把它放在我的數據庫連接之后(不確定這是否同樣重要):
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
對於閱讀這篇文章的其他人來說,我發現添加這些 mysqld 配置行 - 如果您可以訪問 mysql 服務器並且可以進行更改 - 解決了我的彎引號問題。
http://dev.mysql.com/doc/refman/5.6/en/charset-server.html
# Force UTF8 Charset Encoding
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8
我已經仔細檢查了從 PHP 調用的 SQL(看起來很好),並且還從我的 GUI 中手動執行了帶有花括號的插入/更新語句(工作正常),但是仍然從 Web 服務器獲得了多控制插入數據庫的字符。
我檢查了我的 mysql 服務器變量並注意到 latin1 是服務器和數據庫的默認值(即使表/列是 UTF8)。 一旦我添加了上面的行並刷新了發出更新語句的頁面,花括號確實插入正確。 我只能假設這與我們服務器的默認字符集為 latin1 和 Web 服務器 mysql 庫握手協商有關。
正如其他人所說,首先解決以下兩個問題:
如果您在命令行中仍然遇到“ “testâ€
問題,在轉換數據庫之后,請確保在運行mysql
之前在您的 SSH linux CLI 中運行它...
export LANG=en_US.UTF-8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.