为什么PHP的iconv需要setlocale?

时间:2011-10-28 16:07:36

标签: php locale iconv

我正在尝试从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

1 个答案:

答案 0 :(得分:1)

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

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

  

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