簡體   English   中英

使用 PHP 和 MySQL,如何正確地將智能引號寫入數據庫?

[英]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 ...。

表排序規則與字符集不同。

Collat​​ion 是為了QUERYING 的目的自動嘗試將一個字符集轉換為另一個字符集的行為 例如,如果您有一個 latin1 字符集和一個 UTF-8 排序規則,並且您執行類似 SELECT * FROM foo WHERE bar LIKE '%—%'; 之類的操作。 (UTF-8 U+2014) 在具有 latin1 字符集的表上匹配 L+0151U+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 庫握手協商有關。

正如其他人所說,首先解決以下兩個問題:

  • 將您的數據庫轉換為 UTF-8。
  • 發送 UTF-8 HTTP 標頭。

如果您在命令行中仍然遇到“ “testâ€問題,在轉換數據庫之后,請確保在運行mysql之前在您的 SSH linux CLI 中運行它...

export LANG=en_US.UTF-8

暫無
暫無

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

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