我正在尝试从UTF-8字符串中删除所有特殊字符和重音符号,如果可能的话将它们转换为等效的ASCII字符.
所以我只是使用这段代码:
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
问题是例如单词"début"变成"dbut"而不是"debut".为了使它工作,我需要添加对setlocale的调用,如下所示:
setlocale(LC_ALL, 'en_US.UTF8');
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input);
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我认为UTF-8和ASCII总是相同的,无论你使用哪种语言环境.
编辑:我不是说UTF-8等于ASCII,我的意思是UTF-8总是等于UTF-8,ASCII总是等于ASCII
与 ASCII 重叠的 UTF-8 子集(代码点 0-127)确实与 ASCII 相同。但是,带重音的拉丁字符不是 ASCII 字符集的一部分,如果您自己不这样做setlocale
,则系统的默认区域设置(显然不包含这些带重音的字符)用于获取要使用的字符集。
一般来说,iconv
可能有点不确定;扩展的介绍中提到了这一点:
该模块包含 iconv 字符集转换工具的接口。通过该模块,您可以将本地字符集表示的字符串转换为另一种字符集表示的字符串,该字符集可能是Unicode字符集。支持的字符集取决于系统的 iconv 实现。请注意,某些系统上的 iconv 函数可能无法按您的预期工作。在这种情况下,安装 GNU libiconv 库是个好主意。它很可能最终会得到更一致的结果。