[英]How to convert unkown character set into utf8?
我在utf8数据库中将字符串Mühle保存为Mülele。 我希望它在UTF8中,因此它将在我的网页上正确显示,该网页也使用utf8。
我认为字符串没有转换成utf8 befor将其写入数据库,现在它将无法在我的网页上正确显示。
我尝试从我的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。
当您搞乱角色编码时会发生这种情况 - 例如,当您希望连接使用Latin-1时发送UTF-8数据时。 要解决此问题,您需要在创建连接后立即调用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 两次才能修复它,因为这意味着该字符串实际上是三重编码的 - 在数据库文本中两次,一次用于显示。 仔细检查所有内容 ,最好使用像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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.