我正在尝试确定哪些环境因素或其他因素会影响使用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);
?>
预期结果:Padraig's naive cafe
结果在网络浏览器中:(empty string)
CLI的结果:P'adraig's na"ive cafe
在某些系统上,我确实得到了预期的结果,但我无法确定原因。
哪些因素会影响转化,以及我应采取哪些措施来增加获得良好结果的机会?
答案 0 :(得分:4)
语言环境 影响iconv
音译。但是,您应该阅读setlocale
Docs手册页上的警告:
每个进程维护区域设置信息,而不是每个线程。如果您在Windows上运行多线程服务器API(如IIS或Apache)上的PHP,则在脚本运行时您可能会遇到语言环境设置的突然更改,尽管脚本本身从未调用 setlocale()。这是因为其他脚本同时在同一进程的不同线程中运行,使用 setlocale()更改了进程范围的语言环境。
因此,您可以设置区域设置,但它已在其他位置更改。只要语言环境完全相同,您就会得到相同的结果。
你可以在这里找到iconv的文档和源代码:http://www.gnu.org/software/libiconv/ - 这通常是PHP使用的库。
答案 1 :(得分:0)
setlocale
是否返回false?你在跑什么?
您可以尝试在框上运行locale -a
以查看已安装的区域设置,setlocale
应返回您指定的区域设置。
在en_GB.UTF-8
列表中使用locale -a
在centos上运行您的示例会返回预期结果。