2012-12-05 14 views
6

ページにデータフィードを表示しようとしています。奇妙な文字でエンコードの問題が発生しています。何らかの理由で、フィードにU+FFFD文字があります。そしてhtmlentities()は文字をエスケープしないので、手動で置き換える必要があります。PHP:置き換えを行うためにU + FFFDをエンコードする方法は?

は、私は、次の試した(私はPHP 5.3を使用していないよ):上記の作業の

$string = str_replace("\xFFFD", "_", $string); 
$string = str_replace("\XFFFD", "_", $string); 
$string = str_replace("\uFFFD", "_", $string); 
$string = str_replace("\x{FFFD}", "_", $string); 
$string = str_replace("\X{FFFD}", "_", $string); 
$string = str_replace("\P{FFFD}", "_", $string); 
$string = str_replace("\p{FFFD}", "_", $string); 

なし。

このページを読んだ後で - http://php.net/manual/en/regexp.reference.unicode.php - 私は何が間違っているのか分かりません。 UTF-8サポートをPCREにコンパイルする必要はありますか?代わりに、このような

+1

[これは役立つかもしれません](http://stackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace?rq=1)別の言語だが非常に似ている結果 – Dale

+1

str_replaceが正規表現を使用しないので、[preg_replace](http://php.net/preg_replace)関数も試してください – Dale

+0

@endolent、Guys、stop [U + FFFD'文字の乱用](http://それは何**のために意味されていない**のためのstackoverflow.com/questions/4766778/how-to-encode-ufffd-in-order-to-do-a-replace#comment44707644_4766778)。 – Pacerier

答えて

6

使用preg_replace

$string = preg_replace('@\x{FFFD}@u', '_', $string); 
9

あなたは、元の問題を解決しようとする必要があり、FFFDunicode replacement character)は、ほとんどの場合、実際のテキスト文字が、何かをしようとした兆候となるものではありませんUTFエンコーディングでデコードされるが、何かが実際にUTFエンコーディングでエンコードされていないことを示します。これは、無効なバイトを静かに破棄したり、デコード処理を完全に停止したりする代わりに、いずれかの方法でエラーが表示された場合に表示されます。

元の文字が何であるかを知る方法はありません。特にあなたの解決策では、文字を_に置き換えるので、元のソースが正しくデコードされていないことさえ知ることさえできません。ソースに戻って適切にデコードする必要があります。

注:ソーステキストでは、リテラルな通常の文字として、を使用することができます。たとえば、それについて話すときにエラーがない場合などです。私は私の答えでこの可能性を除外しています。

+0

「 」*は「本物の」文字です:)しかし、はい、私はOPが無視しているいくつかの根本的な問題があることに同意します。 +1 – deceze

+0

@decezeまあ、それは普通のテキスト文字ではありませんが、私は正しいことを知っていますか? – Esailija

+0

まあ、それは本当の、普通のテキスト文字です。ちょうど、☃と風は本当のキャラクターです。特別な場合にのみ使用されます。 :) – deceze

関連する問題