HTMLキャラクターエンティティを「通常の」文字に変える…なぜそれが部分的にしか機能していないのですか?

StackOverflow https://stackoverflow.com/questions/2359356

質問

以下のすべてを使用して、データベースから「コード」と呼ばれるフィールドを取得し、すべてのHTMLエンティティを取り除き、「通常どおり」をサイトに印刷します。

   <?php $code = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $code);
   $code = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $code); 
   $code = html_entity_decode($code); ?>

ただし、エクスポートされたコードはまだ次のようになります。

progid:DXImageTransform.Microsoft.AlphaImageLoader(src=’img/the_image.png’);

そこで何が起こっているのかわかりますか?文字列で他にいくつのものを実行して、それらを通常のキャラクターに変えることができますか?!

ありがとう!

ジャック

役に立ちましたか?

解決

’ UTF-8エンコードされた文字を読んだときに得られるものです (右の1つの引用マーク、U+2019)Windows-1252としてエンコードされたかのように。言い換えれば、2つの問題があります。間違ったエンコードを使用して間違ったキャラクターを読むことです。

HTML属性の値は、cury quotesではなく、ASCIIアポストロフィまたは引用符で囲まれていると想定されています。変換している数値エンティティはそうであるはずです &#39; また &#x27 (アポストロフィ)または &#34; また &#x22; (クォーテーションマーク)。代わりに、あなたは持っているように見えます &#146;, 、同じ文字を表します &#x2019;, &#8217, 、 また &rsquo;.

2番目の問題については、結果のテキストはUTF-8としてエンコードされているようですが、ある時点ではWindows-1252のように読まれています。 UTF-8では、キャラクター 3バイトシーケンスで表されます E2 80 99, 、しかし、Windows-1252は各バイトを個別に変換します â, , 、 と . 。それがどこで起こっているとしても、それはあなたが私たちに示したコードにはありません。

良いニュースはあなたのことです preg_replace コードは正しく機能しているようです。 ;)しかし、私はあなたが使用できると言うとき、他の人は正しいと思います html_entity_decode() その部分のためだけに。

他のヒント

たとえば、ページとは異なる文字コーディングを使用している可能性があります。

chr ASCIIでのみ機能するため、ASCII以外のキャラクターはめちゃくちゃになります。私があなたがやろうとしていることを誤解していない限り、正しいCharSetパラメーターを使用してHTML_ENTITY_DECODE()に1回の呼び出しが必要で、他の2行を取り除くことができます。

名前はそれを反映していませんが、 html_entity_decode また、数値文字参照を変換します。

// α (U+03B1) == 0xCEB1 (UTF-8)
var_dump("\xCE\xB1" == html_entity_decode('&#x03B1;', ENT_COMPAT, 'UTF-8'));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top