【问题标题】:How do I transform "ТеÑ" (it is russian word) into something readable?如何将“Теє(它是俄语单词)转换为可读的东西?
【发布时间】:2011-03-12 20:01:57
【问题描述】:

我得到了包含 UTF8 列的 MySQL 数据库,其中包含这样的“Теє记录。 PHP 的 mb_detect_encoding() 告诉我这是 UTF-8。 我怎样才能把这个“恐怖”变成可读的东西?

谢谢

【问题讨论】:

  • 打印(即:回显)并在浏览器中选择UTF-8编码是否正确显示?
  • 是的,它显示正确(用干净的俄语)。但是,如果我在选择行之前执行 mysql_set_charset("utf8", $db) - 我会得到这个“恐怖”。

标签: php mysql encoding character-encoding mojibake


【解决方案1】:

我猜你已经得到了字节字符串"\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,如果这是您所拥有的。

【讨论】:

  • 或者您可以使用 header() 函数设置编码,即:header('Content-type: text/html; charset=utf-8')
  • iconv("UTF-8", "ISO-8859-1", $row['name']) 说注意:iconv():在输入字符串中检测到非法字符。但是如果我不做 mysql_set_charset("utf8", $db) 回显 $row['name'] 也没关系(默认字符集是 latin1)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2022-01-21
    相关资源
    最近更新 更多