4

在经历了大约两打帖子之后,我被正式难住了。我有一个带有 utf8_general_ci 整理列的数据库。使用 PHPMyAdmin,我能够正确地查看表中的 UTF-8 数据(至少据我所知。)我认为我想做的事情很简单。我已经通过多种方式查询了数据,我只想回显 utf-8 值:

echo bin2hex("more…"); //note "…" is a special character
6d 6f 72 65 e2 80 a6 (Hex Value)

但是,如果我只是 echo $row->value 我得到:

6d 6f 72 65 85

它给出的 UTF-8 编码:

6d 6f 72 65 c2 85

我读过的大多数帖子都说要使用 mysql_set_charset("utf8") 但这确实搞砸了:

6d 6f 72 65 26 61 63 69 72 63 3b 80 26 62 72 76 62 61 72 3b

最后使用 mysql_set_charset("utf8") & utf8_encode($var):

6d 6f 72 65 26 61 63 69 72 63 3b c2 80 26 62 72 76 62 61 72 3b

我还尝试在 PHP 中设置 UTF8 设置。Godaddy 使这变得更加困难,所以我使用 ini_set 完成了。但是 mbstring.encoding_translation 不会打开。

// UTF8 settings
ini_set('mbstring.language',            'Neutral');
ini_set('mbstring.internal_encoding',       'UTF-8');
ini_set('mbstring.http_input',          'UTF-8');
ini_set('mbstring.http_output',         'UTF-8');
ini_set('mbstring.encoding_translation',    'On');
ini_set('mbstring.detect_order',        'auto');
ini_set('mbstring.substitute_character',    'long');

关于我需要做什么的任何提示?

4

5 回答 5

4

我敢打赌,您的实际数据可能会以 utf8 以外的方式存储。

首先确保您的数据库设置正确,这意味着所有内容都真正使用 UTF-8 编码存储。

这是我在遇到类似问题时所做的:

始终在干净的表中进行测试,这意味着您应该出于测试目的创建新的数据库和表,并且从一开始就确保实际存储在数据库中的所有数据都是真正的 utf8 编码。

确保数据库编码为 utf8:

CREATE DATABASE `test` CHARACTER SET `utf8` COLLATE `utf8_general_ci`; 

确保包含文本的字段使用 utf8 编码:

CREATE TABLE `test` \
(`id` INT AUTO_INCREMENT PRIMARY KEY, \
`name` VARCHAR(512) COLLATE `utf8_general_ci`) \
CHARACTER SET `utf8` COLLATE `utf8_general_ci`;

确保用于检索数据的连接返回未修改的 UTF-8 字符串。

$connection = mysql_connect( ... );
// Make sure that connection does not change encoding:
mysql_set_charset('utf8', $connection);
// Insert some test data:
mysql_query("INSERT INTO `test` (`name`) VALUES (`Ab✓cdÄö`)", $connection);

之后尝试阅读它并检查它是否像它应该的那样工作,如果它工作那么你知道问题是你现有的数据库、表结构或连接中的某些东西是错误的,应该是我们刚刚在测试中设置的类似的东西环境。

如果您使用 phpmyadmin,只需将所有内容设置为 utf8 并选择在每个点都相同的合适 utf8 排序规则。然后尝试使用 phpmyadmin 将一些数据添加到表中,并尝试使用您的 php 应用程序读取它。utf8_general_ci 应该可以正常工作。

这里的一些信息: MySQL 连接字符集和排序规则

于 2012-04-17T19:06:55.700 回答
2

使用PDO,您可以轻松更改字符集。它还支持准备好的语句、事务等。所以你只需要在创建类时设置字符集就可以了。

来自PHP 手册评论

$db = new PDO('mysql:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
于 2012-04-11T08:50:28.860 回答
1

你可以试试这个:

SET NAMES utf8;
SET CHARACTER SET utf8;

这里这里这里

于 2012-04-11T02:37:09.103 回答
0

感谢 Deceze,罪魁祸首最终是一个需要替换为的 htmlentities 调用:

htmlspecialchars($row['col'], ENT_QUOTES, "UTF-8");

最后,我只是误读了自己的代码。毕竟这一切都是那么微不足道的事情。令人沮丧,但很高兴找到了解决方案。

感谢你的帮助。

于 2012-04-11T05:16:40.507 回答
0

这篇文章解释了在 PHP 和 MySQL 中使用 UTF-8 的所有方面:

希望对您有所帮助并节省您的时间。

于 2014-04-17T15:31:12.053 回答