经过大约二十几个帖子后,我才被正式难倒。我有一个包含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)
但是,如果我只是回显$ row->值,我得到:
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($变种):
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');
关于我需要做什么的任何提示?
答案 0 :(得分: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应该运作良好。
答案 1 :(得分:2)
使用PDO,您可以轻松更改字符集。它还支持预处理语句,事务等。 所以你只需要在类创建上设置charset就可以了。
$db = new PDO('mysql:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
答案 2 :(得分:1)
答案 3 :(得分:0)
感谢Deceze,罪魁祸首最终成为了一个需要被替换的hmmlentities电话:
htmlspecialchars($row['col'], ENT_QUOTES, "UTF-8");
最后我误读了自己的代码。在这段时间之后,这是微不足道的事情。令人沮丧,但很高兴找到解决方案。
感谢您的帮助。
答案 4 :(得分:0)