使用 PHP + MySQL 的 UTF-8 编码问题 [重复]

问题描述 投票:0回答:11

我将数据从 MySQL 4(它们最初设置为

latin2
编码)移动到 MySQL 5,并将编码设置为 UTF-8。在phpMyAdmin里看起来不错,UTF-8也可以。但是,网站上有问号而不是一些字符!网站编码也设置为UTF-8,所以我不明白问题出在哪里。

PHP 和 HTML 文件也设置为 UTF-8。

我该如何解决这个问题?

php mysql encoding utf-8 multibyte
11个回答
30
投票

尝试查询

SET NAMES utf8

在您的应用程序中进行任何查询之前。


25
投票

在我的服务器上,将这些添加到我的 PHP 文件没有效果:

ini_set('default_charset', 'utf-8');
mysql_set_charset('utf8');
header('Content-type: text/html; charset=utf-8');

但是一旦我将它添加到我的 PHP 文件的顶部,一切都完美无缺:

$mysqli->query("SET NAMES 'utf8'");

注意:我在我的数据库中使用编码

utf8_general_ci
,但是
utf8_unicode_ci
对我来说是一样的。


13
投票

尝试将 MySQL 连接设置为 UTF-8:

SET NAMES 'utf8'

并发送明确的 UTF-8 标头,以防万一您的服务器有一些其他默认设置:

header('Content-type: text/html; charset=utf-8');

2
投票

您不必将 PHP 和 HTML 文件设置为 utf-8。

只需将输出编码设置为 UTF-8,浏览器就会正确显示。

在 HTML 中:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

在 PHP 中:

header('Content-Type: text/html; charset=UTF-8');

当你从 MySQL 表中得到一个 UTF-8 的字符串时,除非你转换编码,否则它将一直是 UTF-8 到浏览器输出。这是浏览器解释它的方式。


2
投票

当您在网站上显示 UTF-8 字符,但告诉浏览器将它们解释为 Latin-1(或 Latin-2)时,您会看到这种乱码:

ß

当您在网站上显示 Latin-1(或 Latin-2)字符,但告诉浏览器将它们解释为 UTF-8 时,您会看到问号。

所以我的猜测是您将所有内容都切换为 UTF-8(我的意思是,您告诉数据库引擎、Web 服务器和浏览器您将使用 UTF-8),但您实际上并没有将字符串转换为 UTF- 8.

按照 Darkerstar 所说的做。将您的转储转换为 UTF-8(Notepad++ 可以轻松做到这一点)并再次导入它。


2
投票
mysql_query("SET NAMES UTF8");

在我的“connection.php”末尾添加这一行解决了我的问题。

我的连接文件的完整代码是:

<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_test = "localhost";
$database_test = "test";
$username_test = "username";
$password_test = "password";
$test = mysql_pconnect($hostname_test, $username_test, $password_test) or trigger_error(mysql_error(), E_USER_ERROR);
mysql_query("SET NAMES UTF8");
?>

我的数据库排序规则是“utf8_general_ci”。

页面是“dreamweaver default utf8”和“unicode normalization form=C (Canonical Decomposition)”。


1
投票

我最近遇到了这个问题(我希望这和你遇到的是同一个问题),我尝试了很多方法,但最后起作用的很简单。

将转储的 SQL 文件转换为 UTF-8 格式,然后导入它。

顺便说一句:我使用 Notepad++ 进行转换。


1
投票

在您的网站根目录中放置一个 .htaccess 文件,内容如下: AddDefaultCharset UTF-8

在连接到数据库后设置的 dbconfig 中:

mysql_query("SET NAMES 'utf8'");

1
投票

在 MySQL 中将每个 SQL databasetablefield 设置为 UTF-8 似乎并不足够好。很烦人。

我最终强迫问题解决编码问题:

我必须在我打开数据库的每个地方使用这个

$db->set_charset("utf8");

这奏效了。最后。


0
投票

这是一个修复。将标题设置为

header ('Content-type: text/html; charset=utf-8');
然后使用
utf8_decode($content)
打印您的内容。你必须有两个才能让它发挥作用。


-1
投票

放:

$conn->query("SET NAMES 'utf8'");

$conn 是我的 Mysqli 连接 在我的配置文件中帮助。

© www.soinside.com 2019 - 2024. All rights reserved.