我试图确定哪些环境因素或其他因素对iconv()使用该TRANSLIT选项的调用结果有影响.
在通过Apache和CLI运行时,以下代码在本地对我有不同的结果.
<?php
setlocale(LC_ALL, 'en_GB.UTF-8');
header('Content-type: text/html; charset=utf-8'); // for web
$utf8_string = "Pádraig's naïve café";
echo iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT', $utf8_string);
?>
Run Code Online (Sandbox Code Playgroud)
预期结果: Padraig's naive cafe
Web浏览器中的结果: (empty string)
CLI的结果: P'adraig's na"ive cafe
在某些系统上,我确实得到了预期的结果,但我无法确定原因.
哪些因素会影响转换,我应该采取哪些步骤来增加获得良好结果的机会?
语言环境正在影响iconv音译。setlocale但是,您应该阅读文档手册页上的警告:
区域设置信息是按进程维护的,而不是按线程维护的。如果您在多线程服务器 API(例如 Windows 上的 IIS 或 Apache)上运行 PHP,则在脚本运行时可能会遇到区域设置突然发生变化的情况,尽管脚本本身从未调用setlocale()。发生这种情况是因为其他脚本同时在同一进程的不同线程中运行,使用setlocale()更改进程范围的区域设置。
因此,您可能设置了区域设置,但它在其他地方发生了更改。只要区域设置完全相同,您就会得到相同的结果。
您可以在这里找到 iconv 的文档和源代码:http://www.gnu.org/software/libiconv/ - 这通常是 PHP 使用的库。