1

サードパーティのWebサイトにcURLリクエストを送信しています。このテキストファイルでは、特定の文字を同等のhtmlエンティティに置き換えるためにいくつかの文字列を置き換える必要があります。たとえば、に置き換える必要がありíますí

応答を直接使用string_replace/preg_replace_callbackしても一致は得られなかったため(í直接検索する場合でも、16進コードを使用する場合でも)、置換を実行する前\x00\xEDに使用しました。utf8_encode()ただし、すべての文字を。utf8_encodeに置き換えます。íÃ

なぜこれが発生するのですか?phpを使用して任意のテキストでUTF-8置換を実行するための正しいアプローチは何ですか?

*編集-いくつかのさらなる研究が明らかに

utf8_decode("í") == í;
utf8_encode("í") == í;
utf8_encode("\xc3\xad") ==  í;
4

2 に答える 2

1

utf8_encode は間違いなくここに行く方法ではありません (そうすると二重エンコードになります)。

再。文字を直接検索するか、その 16 進コードを使用して、正規表現の最後に u 修飾子を追加したことを確認しましたか? 例えば/\x00\xED/u

于 2012-05-06T19:51:22.840 に答える
1

PHPソースコードの文字列リテラルを介して置き換えたい文字/文字列を指定している可能性がありますか? その場合、これらの文字列リテラルの値は、php ファイルを保存するエンコーディングに依存します。そのため、文字 í が表示されている間、リテラル値はおそらく 8859-1 エンコーディングのようにラテン語でエンコードされた í である可能性があります。 windows cp1252 í、またはその utf8 í、または utf32 さえも...どれだけ異なるかはわかりませんが、少なくともいくつかは異なるバイト表現を持っているため、php 文字列比較では一致しません。 .

私のポイントは、受信テキストのエンコーディングに一致する正しい文字を指定する必要があるということです.

リテラルを使用しない例を示します

$iso8859_1 = chr(236);
$utf8 = utf8_encode(chr(236));

ファイルのエンコーディングを utf8 に変更することにした場合、エンコーディングを変更すると、テキスト エディタが既存の文字を変換する場合と変換しない場合があることに注意してください。エンコーディングを変更するときに、編集者が本当に奇妙なことをするのを見てきました。新しいファイルから始めます。

また、他のサーバーがutf8を主張しているからといって、それが実際にそうであるとは限りません。

于 2012-05-06T21:44:47.987 に答える