2012-03-19 19 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); 
?> 

期待される結果:WebブラウザでPadraig's naive cafe

結果:CLIから(empty string)

結果:一部のシステムでP'adraig's na"ive cafe

を、「私は期待どおりの結果を得るかが、私はすることができます正確になぜ結びつけるのか。

変換にどのような要素が影響するのですか、また、良い結果を得るためにどのような手順を実行する必要がありますか?

+0

ソースファイルはutf-8ファイルとして保存する必要があります。それ以外の場合は、実際には文字列はutf-8にはなりません。 – ontrack

+0

ファイルはUTF-8として保存されます。 – drewm

+0

あなたは正しい結果を得るシステムは何ですか?それがLinux/Windowsサーバーならば変わるのですか? – James

答えて

4

ロケールは、に影響を与えるです。ただし、setlocale­Docsマニュアルページの警告を読む必要があります。

ロケール情報はスレッドごとではなく、プロセスごとに保持されます。 Windows上のIISやApacheなどのマルチスレッドサーバーAPIでPHPを実行している場合、スクリプトが実行されている間にロケール設定が突然変更されることがありますが、スクリプト自体はsetlocale()を呼び出すことはありません。これは、同じプロセスの異なるスレッドで同時に実行されている他のスクリプトが、setlocale()を使用してプロセス全体のロケールを変更するために発生します。

ロケールを設定しても、別の場所に変更されている可能性があります。ロケールがまったく同じであれば、同じ結果が得られます。

iconvのドキュメントとソースコードは、http://www.gnu.org/software/libiconv/です。これは通常、PHPで使用されるライブラリです。

+0

コード例からわかるように、ロケールは同じですが、結果は異なります。 – drewm

+0

ロケールが同じであるかどうかは、そのロケールが使用されている時点で異なる可能性があるため、言い表すことはできません。それを検証する方法はありません。しかし、libiconvのソースコードを調べると、それがロケールに基づいていることがわかります。 – hakre

0

setlocaleはfalseを返しますか?あなたはどんなOSを走っていますか?

をあなたのボックスにインストールすると、インストールされているロケールを確認できます。setlocaleは、指定したロケールを返す必要があります。

en_GB.UTF-8で上記の例をCentOSで実行すると、locale -aリストに期待される結果が返されます。

+0

'setlocale'は' en_GB.UTF-8'を返します。これはMac OS X 10.7.3にあります。 – drewm

関連する問題