2012-03-19 17 views
11

我試圖確定哪些環境因素或其他因素對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

回答

4

區域設置影響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

0

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

相關問題