哪些因素会影响成功的iconv()TRANSLIT转换?

时间:2012-03-19 14:20:48

标签: php iconv

我正在尝试确定哪些环境因素或其他因素会影响使用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

在某些系统上,我确实得到了预期的结果,但我无法确定原因。

哪些因素会影响转化,以及我应采取哪些措施来增加获得良好结果的机会?

2 个答案:

答案 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上运行您的示例会返回预期结果。