什么因素影响成功的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

在某些系统上,我得到预期的结果,但我可以”严格把握为什么。

什么因素影响转换,我应该遵循哪些步骤来增加获得好结果的机会?

+0

您的源文件应该保存为utf-8文件。否则,即使你告诉iconv,它的字符串实际上也不会是utf-8。 – ontrack 2012-03-19 14:56:24

+0

该文件保存为UTF-8。 – drewm 2012-03-19 15:11:01

+0

什么系统可以得到正确的结果?如果它是Linux/Windows服务器,它会改变吗? – James 2012-03-19 15:26:51

区域设置影响iconv音译。但是,你应该阅读setlocale­Docs手册页上的警告:

区域设置信息每个进程维持,而不是每个线程。如果您在多线程服务器API(如Windows上的IIS或Apache)上运行PHP,则脚本运行时可能会遇到区域设置突然更改,但脚本本身从不称为setlocale()。发生这种情况是由于其他脚本同时在同一进程的不同线程中运行,因此使用setlocale()更改了进程范围的区域设置。

因此,您可能会设置区域设置,但它在其他地方已更改。只要区域设置完全相同,您将获得相同的结果。

您可以在这里找到iconv的文档和源代码:http://www.gnu.org/software/libiconv/ - 这通常是PHP使用的库。

+0

从代码示例中可以看到,语言环境相同,但结果不同。 – drewm 2012-03-19 22:33:54

+0

您不能说区域设置是否相同,因为在使用时它可能会有所不同。而且你无法验证这一点。但是,如果您查看libiconv的源代码,则会看到它基于语言环境。 – hakre 2012-03-20 10:26:00

setlocale返回false?你在运行什么操作系统?

您可以尝试在您的框上运行locale -a以查看安装的语言环境,setlocale应返回您指定的语言环境。

在列表中使用en_GB.UTF-8列表运行您的以上示例上的示例返回预期结果。

+0

'setlocale'返回'en_GB.UTF-8'。这是在Mac OS X 10.7.3上。 – drewm 2012-03-19 15:38:26