Kir*_*lla 3 php mysql encoding character-encoding mojibake
我得到了包含UTF8列的MySQL DB,其中包含这样的"ТÐμÑ"记录.PHP的mb_detect_encoding()告诉我这是UTF-8.我怎样才能将这种"恐怖"变成可读的东西?
谢谢
我猜你有字节字符串"\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); ?>
Run Code Online (Sandbox Code Playgroud)
这自然也意味着你需要.php使用UTF-8编码保存文件本身,如果它有任何非ASCII字符.(很遗憾,许多Windows文本编辑器默认情况下不会保存为UTF-8.)
如果你必须有一个非UTF-8页面,你必须使用iconv()将字符串转换为你正在使用的任何编码,大概是Windows代码页1251 for Russian('cp1251').但我强烈建议在所有方面使用UTF-8.
编辑评论:
如果我在选择行之前正在做mysql_set_charset("utf8",$ db) - 我得到这个"恐怖"
mysql_set_charset('utf8')确实是正确的做法.检查您是否包含meta上述内容,并且浏览器正在查看它(请查看View-> Encoding是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和浏览器知道这(通过检查查看- >编码),所以它不是真正意义是什么,你在屏幕上看到你的时候echo(); 我们无法弄清楚原始字节字符串是什么.
告诉我们你的看法echo bin2hex($row['name']);.这将字符串转换成十六进制数字中的每个字节进行转换,所以"\xd0\xa2\xd0\xb5\xd1"会出来的d0a2d0b5d1,如果这是你的本事.