5

HTMLエンコードされた方法で出力しようとしている文字列があり、htmlentities()関数は常に空の文字列を返します。

なぜそうするのか、私は正確に知っています。私は PHP 5.4 を実行していません。最新の PHP 5.3 フレーバーをインストールしました。

問題は、無効なコード ユニット シーケンスを含む文字列をどのように htmlencode できるかということです。

マニュアルによると、ENT_SUBSTITUTE行く方法です。しかし、この定数は PHP 5.3.X では定義されていません。

これは私がしました:

if (!defined('ENT_SUBSTITUTE')) {
    define('ENT_SUBSTITUTE', 8);
}

まだ運がない。htmlentitiesまだ空の文字列を返しています。

代わりに試してみたかったENT_DISALLOWEDのですが、対応する長い値が見つかりません。

だから私の質問は二つ折りです

  1. PHP 5.4 の定数値は何ENT_DISALLOWEDですか?

  2. UTF-8 以外の文字 (スマート クォートなど) を含む文字列をクリアできるようにするにはどうすればよいですか? - スマート クォートだけでなく、htmlentities()空白文字列を返す原因となるもの。

4

2 に答える 2

3

htmlentities()PHP 5.3 にはフラグがないのは事実ですENT_SUBSTITUTEが、(実際には推奨されていませんが)ENT_IGNOREフラグがあります。注記に注意し、使用する前に理解するようにしてください。

このフラグの使用はお勧めしません。 » セキュリティに影響する可能性があるためです。

そもそもなぜ入力文字列に問題があるのか​​を理解しておくことは、はるかに良いことです。ほとんどの場合、ユーザーは正しいエンコーディングを指定するだけで不足しています。

たとえば、最初に文字列を UTF-8 に再エンコードしてから、htmlspecialchars()orに渡しhtmlentities()ます。スマート クォートといえば、おそらく Windows-1252 でエンコードされた文字列を使用しているでしょう。使用する前にそれを変換する必要さえありません。文字セットを適切に指定するだけです (PHP 5.3):

htmlentities($string, ENT_QUOTES, $encoding = 'Windows-1252');

当然、これは入力が Windows-1252 (CP1252) でエンコードされている場合にのみ機能します。$string最初に正しいエンコーディングを見つけてください。そうすれば、通常は問題ありません。サポートされていないエンコーディングについては、たとえばiconvmb_stringを使用して、最初にサポートされているエンコーディングに再エンコードします。

于 2013-05-11T12:27:24.643 に答える
2

おっしゃる通り、これらの定数は で追加されまし5.4.0。問題は、サポートも新しいということです5.4.0。つまり、必要な値を渡すことができますが、古い人htmlentitiesはそれを理解できません。

ほとんどの場合、php の変更ログは誤解を招きます。

于 2012-09-24T21:18:02.203 に答える