使用mb_convert_encoding函数是否是一种好习惯



这个问题与 UTF-8 一直不同,因为它询问安全性以及使用 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 是否会丢失字节?

谢谢

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

换句话说:如果你不知道字符串的编码是什么,你也无法有意义地将其转换为其他任何东西,只是试图转换它是一个̄\_(ツ)_/̄废话,结果同样可能是有用的和完全垃圾。

如果遇到未知编码,则只有以下几种选择:

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

最新更新