如何将“ТÐμÑ”(这是俄语单词)转换成可读的东西?

时间:2010-07-07 13:38:50

标签: php mysql encoding character-encoding mojibake

我得到的MySQL DB包含UTF8列,其中包含“ТÐμÑ”记录。 PHP的mb_detect_encoding()告诉我这是UTF-8。 我怎样才能将这种“恐怖”变成可读的东西?

谢谢

2 个答案:

答案 0 :(得分:9)

我猜你有字节字符串"\xd0\xa2\xd0\xb5\xd1",然后是字符Те的UTF-8编码形式(加上一个后续字节,即半个字符)

如果你只是echo()在你声明为UTF-8的页面上,它应该在浏览器上正确显示:

 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
 ...

 something: <?php echo htmlspecialchars($something); ?>

这自然也意味着你需要使用UTF-8编码保存.php文件,如果它有任何非ASCII字符。(许多Windows文本编辑器往往不保存为UTF-8很遗憾,遗憾的是。)

如果您必须拥有非UTF-8页面,则必须使用iconv()将字符串转换为您使用的任何编码,大概是Windows代码页1251 for Russian('cp1251') 。但我强烈建议一直使用UTF-8。

编辑评论:

  

如果我在选择行之前正在做mysql_set_charset(“utf8”,$ db) - 我得到这个“恐怖”

mysql_set_charset('utf8')确实是正确的做法。检查您是否包含上述meta以及浏览器正在查看它(请查看查看 - &gt;编码为UTF-8)。

如果你正在获得ТеÑ即使UTF-8被正确发送,那么我担心数据库的当前内容会搞砸。也许以前插入的数据没有正确的mysql_set_charset调用,或者您执行了使用错误字符集的SQL导入。

如果是这种情况,您可能需要遍历数据库的每一行并使用iconv()将UTF-8转换为ISO-8859-1来“修复”它。这应该撤消双UTF-8编码。

[编辑:2]

  

iconv(“UTF-8”,“ISO-8859-1”,$ row ['name'])说通知:iconv():检测到输入字符串中的非法字符。

好的,所以输入不是有效的UTF-8序列。这可能是因为你毕竟没有从数据库中获取UTF-8,或者因为UTF-8序列被截断了。例如,您的字符串"\xd0\xa2\xd0\xb5\xd1"(读作ISO-8859-1,看起来像"ТеÑ")无效,因为最终"Ñ"只是两字节UTF的一半-8序列。作为浏览器中的UTF-8,它将呈现为Те�

如果这是您在数据库中拥有的内容,则需要先修复数据,然后才能继续。

  

如果我在没有$row['name']

的情况下回复mysql_set_charset("utf8", $db),那就没关系

您尚未确认您是否正确发送UTF-8并且浏览器知道这一点(通过查看View-&gt;编码),因此当您echo()时,您在屏幕上看到的内容并不重要;我们无法弄清楚原始字节字符串是什么。

告诉我们您echo bin2hex($row['name']);时所看到的内容。这会将字符串中的每个字节转换为十六进制数字,因此"\xd0\xa2\xd0\xb5\xd1"将显示为d0a2d0b5d1,如果这就是您所拥有的。

答案 1 :(得分:1)

输出到指定了UTF8编码的页面。浏览器将以可读的形式显示它。