我猜你已经得到了字节字符串"\xd0\xa2\xd0\xb5\xd1",那么这将是字符Те 的UTF-8 编码形式(加上后面的一个字节,即半个字符)。
如果您只是在您声明为 UTF-8 的页面上echo(),它应该在浏览器上正确显示:
<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 ('cp1251')。但我强烈建议从头到尾都使用 UTF-8。
编辑重新评论:
如果我在选择行之前执行 mysql_set_charset("utf8", $db) - 我会得到这个“恐怖”
mysql_set_charset('utf8') 确实是正确的做法。检查您是否包含上述meta,并且浏览器是否可以看到它(检查查看->编码是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->Encoding),因此当您 echo() 时在屏幕上看到的内容并没有真正意义;我们无法从中找出原始字节字符串是什么。
告诉我们您在echo bin2hex($row['name']); 时看到了什么。这会将字符串中的每个字节转换为十六进制数字,因此"\xd0\xa2\xd0\xb5\xd1" 将显示为d0a2d0b5d1,如果这是您所拥有的。