0

我在 utf8 数据库中将字符串 Mühle 保存为 Mühle。我希望它采用 UTF8 格式,因此它会在我的网页上正确显示,该网页也使用 utf8。

我认为该字符串在写入数据库之前未转换为 utf8,现在它无法在我的网页上正确显示。

我尝试从我的 mysql 数据库中选择此字符串并将其转换为 utf8,但它不起作用。我也尝试过多次解码,但也没有用。请参阅下面我使用的代码:

$string = Mühle;
$string=utf8_encode($string);
echo $string;

$string = Mühle;
$string=utf8_decode($string);
$string=utf8_encode($string);
echo $string;

上述代码的输出与两种情况下的输入相同,没有改变字符串的任何内容。

我能做些什么来转换这个字符串,以便我可以在我的 mysql 数据库中更新它,并且在下次选择它时它会正确显示为 Mühle?

4

2 回答 2

2

您的字符串是双重编码的 UTF-8 - 即 UTF-8 被解释为 Latin-1,然后重新编码为 UTF-8。

当您弄乱字符编码时,可能会发生这种情况 - 例如,当您发送 UTF-8 数据而您的 MySQL 期望连接使用 Latin-1 时。要解决此问题,您需要在创建连接后立即调用mysqli_set_charset(或数据库 API 的等效函数),或修改 MySQL 配置以默认使用 UTF-8 连接。

此外,您将需要修复您的数据 - 这是使用 utf8_decode 适当次数完成的。如果“Mühle”是您的数据库使用 UTF-8 连接返回的确切字节,您需要读取该字符串,通过 utf8_decode 发送它,然后更新该行(仍然使用 UTF-8 连接)。

请注意,当您在 MySQL 中选择一行时,它会从表字符集转换为连接字符集,然后再发送回客户端。因此,如果您在屏幕上看到“Mühle”,说明 MySQL 使用的是 UTF-8 连接,并且您将字符串显示为 UTF-8,您需要调用 utf8_decode两次才能修复它,因为这意味着该字符串实际上是三重编码的 - 两次在数据库文本中,一次用于显示。仔细检查所有内容,最好使用开发良好的 MySQL 客户端,如phpMyAdmin - 直到它在那里正确显示,您的数据仍然编码不正确

如果这只是几行的问题,手动修复是可以的;如果这是您的数据库的一般问题,您可能更愿意转储 SQL 脚本,转换文件,并使用它来替换旧数据。

于 2012-08-16T19:40:12.547 回答
0

试试下面的功能。它将字符串转换回 UTF-8。

function convert_smart_quotes($string)
{
$string = htmlentities($string);
$string = mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8');
$string = htmlspecialchars_decode(utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8', false)));

$s = array(
    chr(145) => "'",
    chr(146) => "'",
    chr(147) => '"',
    chr(148) => '"',
    chr(151) => '-',
    's©' => '©',
    '®' => '®',
    '™' => '™', //™
    '“' => '"', // left side double smart quote
    'â€' => '"', // right side double smart quote
    '‘' => "'", // left side single smart quote
    '’' => "'", // right side single smart quote
    '…' => '...', // elipsis
    '—' => '-', // em dash
    '–' => '-', // en dash
);

return strtr($string, $s);
}
于 2013-04-05T16:09:42.000 回答