什么因素影响成功的iconv()TRANSLIT转换?
我试图确定哪些环境因素或其他因素对iconv()
与TRANSLIT
选项的呼叫结果有影响。什么因素影响成功的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);
?>
预期结果:(empty string)
从CLI结果:Padraig's naive cafe
在Web浏览器结果P'adraig's na"ive cafe
在某些系统上,我得到预期的结果,但我可以”严格把握为什么。
什么因素影响转换,我应该遵循哪些步骤来增加获得好结果的机会?
区域设置是影响iconv
音译。但是,你应该阅读setlocale
Docs手册页上的警告:
区域设置信息每个进程维持,而不是每个线程。如果您在多线程服务器API(如Windows上的IIS或Apache)上运行PHP,则脚本运行时可能会遇到区域设置突然更改,但脚本本身从不称为setlocale()。发生这种情况是由于其他脚本同时在同一进程的不同线程中运行,因此使用setlocale()更改了进程范围的区域设置。
因此,您可能会设置区域设置,但它在其他地方已更改。只要区域设置完全相同,您将获得相同的结果。
您可以在这里找到iconv的文档和源代码:http://www.gnu.org/software/libiconv/ - 这通常是PHP使用的库。
是setlocale
返回false?你在运行什么操作系统?
您可以尝试在您的框上运行locale -a
以查看安装的语言环境,setlocale
应返回您指定的语言环境。
在列表中使用en_GB.UTF-8
列表运行您的以上示例上的示例返回预期结果。
'setlocale'返回'en_GB.UTF-8'。这是在Mac OS X 10.7.3上。 – drewm 2012-03-19 15:38:26
您的源文件应该保存为utf-8文件。否则,即使你告诉iconv,它的字符串实际上也不会是utf-8。 – ontrack 2012-03-19 14:56:24
该文件保存为UTF-8。 – drewm 2012-03-19 15:11:01
什么系统可以得到正确的结果?如果它是Linux/Windows服务器,它会改变吗? – James 2012-03-19 15:26:51