簡體   English   中英

PHP / MySQL 中的特殊字符

[英]Special characters in PHP / MySQL

我在數據庫中有包含特殊字符的單詞(主要是西班牙語,如波浪線)。 在數據庫中,所有內容都使用 PHPmyAdmin 正確保存和顯示,但是當我獲取數據(使用 PHP)並在瀏覽器中顯示時,我得到一個奇怪的字符,比如“?” 有一個正方形......我需要一個一般修復,所以我不需要每次都轉義每個字符,而且我可以將 PHP 表單中的特殊西班牙字符插入數據庫......

HTML 是正確的:

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

所有表和數據庫都設置為 utf8_spanish

我得到的角色: �

有什么建議么???

謝謝!!!

我只想提供有關vartec提出的解決方案的更多詳細信息,該解決方案是(取決於您的 MySQL 安裝)對您的問題最正確的解決方案。 首先,MySQL 中的字符集/編碼問題是一個有點復雜的主題,在 MySQL 手冊第 9.1 章“字符集支持”中進行了廣泛介紹。 在您的情況下,尤其是9.1.4。 “連接字符集和排序規則”將是最相關的。

簡而言之:MySQL 必須知道您的客戶端應用程序的字符集/編碼(從數據庫的角度來看,即您的 PHP 腳本),因為它會從服務器定義的內部字符集/編碼中轉碼所有字符串數據,數據庫級、表級或列級進入連接字符集/編碼。 您在客戶端使用 UTF-8,因此必須告訴 MySQL 您使用的是 UTF-8。 這是通過 MySQL 命令SET NAMES 'utf8'完成的,該命令必須作為打開連接時的第一個查詢發送。 根據您的安裝和您在 PHP 腳本中使用的 MySQL 客戶端庫,這可以在每次連接時自動完成。

如果使用 PDO 只需設置一個配置參數

$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

使用 mysqli 更改客戶端字符集/編碼更加簡單:

$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");

我希望這將有助於使整個事情更容易理解。

連接后立即發出SET NAMES 'utf8'

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");

讓 MySQL 自動翻譯

$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);

http://es.php.net/manual/en/function.mysql-set-charset.php

編輯:從我收集到的評論中,這實際上是用 latin1 編碼的,所以

mysql_set_charset('latin1_spanish_ci',$conn);

我從某個地方發現了這個,從那時起就一直在使用它而沒有想太多。

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

將 HTML 字符集更改為 ISO-8859-1 解決了問題! 愚蠢的

神聖的廢話..這讓我發瘋了。 我試圖做同樣的事情。 我添加了一個 utf-8 編碼 HTML header .. mysqli_set_charset() 救了我,幾個小時后,但我很高興我現在可以工作了

另一個嘗試編碼特殊字符和重音符號的 function 是 htmlentities()

你可以簡單地做:

$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);

對我有用的答案是 Stefan Gehrig 發布的答案:

$mysqli->set_charset("utf8");

在定義連接和解決問題后,我只需要添加該行::)

(我正在發布答案,因為我無法發表評論......)。

在 HTML 中打開 unicode 編碼。

在處理特殊字符時,我總是注意以下事項:

  • 數據庫、表和字段字符集都設置為 utf8_general_* 或 utf8_unicode_*
  • 我確保我的編輯器使用正確的字符集保存 PHP 文件
  • 我將 php.ini 中的 default_charset 設置為 UTF-8
  • 我發送一個 Content-Type: text/html; 字符集=UTF-8 header
  • META 標記中的字符集是 UTF-8(這被 Content-Type HTTP 標頭覆蓋)
  • 連接到 MySQL 時,我發出以下查詢:
    • 設置名稱 utf8
    • 設置字符集 utf8
    • SET COLLATION_CONNECTION="utf8_general_ci"/"utf8_general_ci"

你確定你的數據庫中有 UTF8 數據嗎?

我的解決方案是:執行上述所有操作,但我也使用記事本++,並且文件必須像這樣保存:go 在manu選項卡中進行編碼並保存文件->在utf8中編碼

有趣的是,這段代碼對我不起作用:

$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1

但是,在條件內設置字符集是有效的:

if (!mysqli_set_charset($link, "utf8")) {
    printf("Error loading character set utf8: %s\n", mysqli_error($link));
    exit();
} else {
    printf("Current character set: %s\n", mysqli_character_set_name($link));
    //shows utf8
}

我的設置:

$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64

This answer here will come in handy for those connecting to their MySQL or Mariadb database the procedural way from PHP using the MySQLi functions like me.

這是人們如何以程序方式進行操作的方法。 見下文;

<?php

$host = "localhost";
$user = "user";
$passwd = "password";
$database = "database";

$con = mysqli_connect($host, $user, $passwd, $database);
mysqli_set_charset($con, "utf8");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

?>

The following answer may be valuable to those connecting to their MySQL or Mariadb database the procedural way from PHP using the MySQLi functions like I often do when not connecting via PDO ( the PHP Data Objects ).

這是您如何以程序方式進行操作的方法。 見下文;

<?php

$host = "localhost";
$user = "user";
$passwd = "password";
$database = "database";

$con = mysqli_connect($host, $user, $passwd, $database);
mysqli_set_charset($con, "utf8");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}

?>

暫無
暫無

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

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