【问题标题】:mb_detect_encoding detects ASCII as UTF-8?mb_detect_encoding 将 ASCII 检测为 UTF-8?
【发布时间】:2013-04-24 07:11:07
【问题描述】:

我正在尝试将导入的 IPTC 元数据从图像自动转换为 UTF-8 以存储在基于 PHP mb_ 函数的数据库中。

目前看起来是这样的:

$val = mb_convert_encoding($val, 'UTF-8', mb_detect_encoding($val));

但是,当 mb_detect_encoding() 提供一个 ASCII 字符串(Latin1 字段中从 192-255 的特殊字符)时,它会将其检测为 UTF-8,因此在以下尝试将所有内容转换为正确的 UTF-8 所有特殊字符字符被删除。

我尝试通过查找 Latin1 值来编写自己的方法,如果没有出现,我将继续让 mb_detect_encoding 决定它是什么。但是当我意识到我不能确定其他编码不会对其他事物使用相同的字节值时,我中途停了下来。

那么,有没有办法正确检测 ASCII 以作为源编码提供给 mb_convert_encoding

【问题讨论】:

  • 给定一个字符串只能确定它是否不属于特定的编码。 mb_detect_encoding 函数将检查您的字符串并尝试“猜测”它的编码是什么。
  • 那是什么? ASCII 还是 Latin-1?不可能两者兼而有之。另外,是编码变量,还是您知道编码?你能get一些元数据的编码吗? “检测”编码(阅读:最好的猜测)从来都不是一个好主意;编码需要指定

标签: php string utf-8 ascii multibyte


【解决方案1】:

指定一个自定义顺序,首先检测 ASCII 是有效的。

mb_detect_encoding($val, 'ASCII,UTF-8,ISO-8859-15');

为了完整起见,可用编码列表位于http://www.php.net/manual/en/mbstring.supported-encodings.php

【讨论】:

  • 只想补充一点,ASCII 始终是有效的 UTF-8(但不是相反)。请记住,ASCII 不是 Latin1 (ISO-8859-1)!
【解决方案2】:

你可以明确指定

$val = mb_convert_encoding($val, 'UTF-8', 'ASCII');

编辑:

$val = mb_convert_encoding($val, 'UTF-8', 'auto');

【讨论】:

  • 是的,如果我能确定我不能确定我正在导入什么,这将起作用。因此所有的检测...
【解决方案3】:

如果您不想担心您将允许哪些编码,您可以将它们全部添加

$encoding = mb_detect_encoding($val, implode(',', mb_list_encodings()));

【讨论】:

  • 我可以,但是mb_list_encodings() 不能让我控制列出编码的顺序。
猜你喜欢
  • 2018-12-28
  • 1970-01-01
  • 2019-10-31
  • 2012-08-04
  • 1970-01-01
  • 2012-10-29
  • 2011-06-26
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多