0

我正在尝试通过远程 mysql 数据库连接检索外语 UTF8 数据。当我远程检索数据时,utf8 没有正确显示在浏览器中。但是,当我通过本地数据库连接检索数据时,无论是在实时站点上还是在本地测试机器上,字符都会正确显示在浏览器中。

我的远程连接是从 wamp 本地服务器到在线实时网站。

对于我设置的每一页:

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

我也尝试设置 UTF-8 元标记。我还在 .htaccess 中指定了 UTF8 作为默认字符集。

这是一个较旧的网站,所以我仍在使用 mysqli。我也尝试过设置:

$mysqli->set_charset("utf8");

例如,通过远程连接,Français 显示为 Français。

我不知道该怎么办。我花了几个小时试图弄清楚,但无济于事。我知道要求代码是常态,但是代码太多了,我不能在这里全部包括在内。

谢谢!

4

2 回答 2

1

您的解决方案是:在远程数据库上,数据被编码为 utf8 两次,这会产生不正确的结果。您的代码没有问题,该数据库有问题。您可以在那里修复它(如果是 varchar,请先备份!):先将其转换为 latin1,然后转换为二进制,然后再转换为 utf8。一个有效的 sql fiddle 向您展示这里的情况,我也会将代码粘贴在这里,以防 sqlfiddle 将来在某个地方将其删除:

-- database column correctly defined as utf8
CREATE TABLE base (col VARCHAR(128) CHARSET utf8);
-- wrong data is entered:
INSERT INTO base SELECT UNHEX('4672616EC383C2A7616973');
-- first, convert back to latin-1, we have now proper utf-8 data, but in a latin1 column
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET latin1;
-- convert to binary first, so MySQL leaves the bytes as is without conversion
ALTER TABLE base MODIFY COLUMN col VARBINARY(128);
-- then convert to the proper character set, which will leave the bytes once again intact
ALTER TABLE base MODIFY COLUMN col VARCHAR(128) CHARSET utf8;
于 2013-06-05T17:32:00.573 回答
0

我通过将以下内容添加到调用远程数据库的脚本中使其工作:

$mysqli->set_charset("latin1");

我不知道这是否有点骇人听闻,因为它仍然意味着字符可能没有正确编码或整理,但它可以工作。感谢 Wrikken 向我展示了字符集修改,我可以尝试在未来使用这些修改来正确纠正问题。

于 2013-06-06T01:11:53.327 回答