我得到的MySQL DB包含UTF8列,其中包含“ТÐμÑ”记录。 PHP的mb_detect_encoding()告诉我这是UTF-8。 我怎样才能将这种“恐怖”变成可读的东西?
谢谢
答案 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编码的页面。浏览器将以可读的形式显示它。