使用mb_convert_encoding函数是一个好习惯

时间:2018-03-07 12:52:42

标签: php postgresql encoding character-encoding

这个问题与UTF-8 all the way through不同,因为它询问安全性如何,并且使用mb_convert_encoding函数是一种好习惯。

假设用户可以使用PHP API上传文件。每个文件名和路径都存储在PostgreSQL数据库表中,该表以UTF-8作为默认编码。

有时,用户上传名称不是UTF-8编码的文件,并将其导入数据库。问题是非UTF-8编码的字符是乱码的,不能在表格列中显示。

我在考虑在导入之前将以下内容添加到PHP代码中:

if ( ! mb_check_encoding($output, 'UTF-8') {
    $output = mb_convert_encoding($content, 'UTF-8'); 
}

这看起来是一个好习惯,如果我将UTF-8作为输出返回,它是否会被用户的客户端正确显示和转换?使用mb_convert_encoding会对字节造成潜在损失吗?

由于

1 个答案:

答案 0 :(得分:0)

如果您要转换编码,则需要知道从转换的内容。你可以检查编码是否有效UTF-8,但是如果它告诉你它不是有效的UTF-8那么你仍然不知道它是什么 。从$from_encoding省略mb_convert_encoding参数只会使其为该参数设置一些预设编码,但这并不意味着该编码中$content实际

换句话说:如果你不知道字符串是什么编码,你也不能有意义地把它转换成其他任何东西,只是试图从¯\ _(ツ)_ /¯转换它是一个crapshoot与结果同样可能是有用的东西和彻底的垃圾。

如果您遇到未知编码,您只有几个选择:

  1. 拒绝输入值。
  2. 测试它是否是少数其他预期编码之一,然后明确转换为您的最佳猜测;但这也是一个废话。
  3. 只需在值上使用bin2hex或类似内容,基本上放弃尝试正确解释它,但仍然保留原始值。