HTMLキャラクターエンティティを「通常の」文字に変える…なぜそれが部分的にしか機能していないのですか?
-
23-09-2019 - |
質問
以下のすべてを使用して、データベースから「コード」と呼ばれるフィールドを取得し、すべての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アポストロフィまたは引用符で囲まれていると想定されています。変換している数値エンティティはそうであるはずです '
また '
(アポストロフィ)または "
また "
(クォーテーションマーク)。代わりに、あなたは持っているように見えます ’
, 、同じ文字を表します ’
, ’
, 、 また ’
.
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('α', ENT_COMPAT, 'UTF-8'));