【问题标题】:Why does PHP's iconv need setlocale?为什么 PHP 的 iconv 需要 setlocale?
【发布时间】:2011-10-28 16:07:35
【问题描述】:

我目前正在尝试从 UTF-8 字符串中删除所有特殊字符和重音符号,如果可能的话,将它们转换为等效的 ASCII 字符。

所以我只是使用这段代码:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);

问题在于,例如“début”这个词变成了“dbut”而不是“debut”。 为了让它工作,我需要添加一个对 setlocale 的调用,如下所示:

setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);

我不明白为什么。我认为 UTF-8 和 ASCII 总是相同的,无论你使用什么语言环境。

编辑:我不是说 UTF-8 等于 ASCII,我的意思是 UTF-8 总是等于 UTF-8 而 ASCII 总是等于 ASCII

【问题讨论】:

  • ASCII 和 UTF-8 不一样。 UTF-8 要大几个数量级。

标签: php locale iconv


【解决方案1】:

与 ASCII 重叠的 UTF-8 子集(即代码点 0-127)确实与 ASCII 相同。但是,重音拉丁字符不是 ASCII 字符集的一部分,如果您自己不setlocale,系统的默认语言环境(显然不包含这些重音字符)将用于获取可使用的字符集。

一般来说,iconv 可能有点不确定;这在扩展的introduction 中提到:

这个模块包含一个iconv字符集转换的接口 设施。使用此模块,您可以将由 a 表示的字符串 将本地字符集转换为由另一个字符集表示的字符集, 这可能是 Unicode 字符集。支持的字符集 取决于系统的 iconv 实现。 注意 iconv 某些系统上的功能可能无法按预期工作。 在这种情况下, 安装 GNU libiconv 库是个好主意。它会 很可能最终得到更一致的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2010-10-12
    • 1970-01-01
    • 2017-01-04
    • 2012-01-04
    • 2019-06-09
    相关资源
    最近更新 更多