如何将未识别的字符集转换为 utf8


How to convert unkown character set into utf8?

我将字符串 Mühle 保存在 utf8 数据库中的 MÃ1/4hle 中。我希望它采用 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?

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

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

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

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

如果

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

尝试以下函数。 它会将字符串转换回 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);
}