如何将未知字符集转换为utf8?

时间:2012-08-16 16:43:07

标签: php utf-8 utf8-decode

我在UTF数据库中将字符串Mühle保存为Mülele。我希望它在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时选择它?

2 个答案:

答案 0 :(得分:2)

你的字符串是双重编码 UTF-8 - 即被解释为Latin-1然后重新编码为UTF-8的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脚本,转换那个文件,并用它来替换旧数据。

答案 1 :(得分: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);
}