2011-10-28 14 views
5

私は現在、UTF-8文字列からすべての特殊文字とアクセント記号を可能な限りASCII文字に変換しようとしています。PHPのiconvがsetlocaleを必要とするのはなぜですか?

だから私は単純にこのコードを使用しています:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

問題は、例えば単語「デビュー」の代わりに「デビュー」の「dbut」に変わるということです。 それを動作させるために、私はこのような、のsetlocaleの呼び出しを追加する必要があります。

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

そして私はなぜ理解していません。 UTF-8とASCIIは、あなたが使っているロケールであれ常に同じものだと思っていました。

編集:私はコードである(私は常にUTF-8に等しく、ASCIIは常にASCIIと重複するUTF-8のサブセットをASCII

+0

ASCIIとUTF-8は同じものです。 UTF-8は桁違いに大きくなります。 – NikiC

答えて

1

に等しいUTF-8を意味し、UTF-8はASCIIと等しいという意味ではありませんでしたポイント0〜127)は、実際にASCIIと同じです。ただし、アクセント付きのラテン文字はASCII文字セットの一部ではなく、setlocaleを使用していない場合、システムのデフォルトロケール(アクセント記号付き文字は含まれていません)を使用して文字セットを取得します。

一般に、iconvは少しでもかまいません。これは、拡張機能のintroductionに記載されている:

このモジュールは文字セット変換 施設をiconvによるためのインタフェースが含まれています。このモジュールを使用すると、 ローカル文字セットで表される文字列を、Unicode文字セットである別の文字セット で表される文字列に変換できます。サポートされている文字セット は、システムのiconv実装に依存します。 一部のシステムでiconv 機能が期待通りに機能しないことがあります。このような場合、 GNU libiconvライブラリをインストールすることをお勧めします。 はおそらくより一貫した結果をもたらすでしょう。

関連する問題