2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[関数系] htmlspecialcharsにおける注意点

Last updated at Posted at 2018-07-16

概要

htmlspecialcharsを使うためにphp.netを読んでいたところ、そんなことやってんだ。と思ってことがあったので、メモがてら投稿。

htmlspecialcharsの定義

string htmlspecialchars (
     string $string 
     [, int $flags = ENT_COMPAT | ENT_HTML401 
     [, string $encoding = ini_get("default_charset")
     [, bool $double_encode = TRUE ]]] )
引数 説明
$string 変換される文字列
$flags フラグを組み合わせたビットマスク。 クォートや無効な符号単位シーケンス、そして文書型の扱いを指定。 デフォルトは ENT_COMPAT or ENT_HTML401
$encoding オプションの引数。文字を変換するときに使うエンコーディングを定義。省略した場合の encoding のデフォルト値は、varies PHP のバージョンによって異なる。 PHP 5.6.0 以降では、デフォルト値として default_charset の値を使用。PHP 5.4 と PHP 5.5 のデフォルト値は、 UTF-8 で、それより前のバージョンの PHP のデフォルト値は ISO-8859-1。
$double_encode double_encode をオフにすると、PHP はすでに変換済みのhtmlをエンコードしない。 デフォルトでは、既存のエンティティも含めてすべてを変換。

$flagsの内容

定数名 説明
ENT_COMPAT ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES シングルクオートとダブルクオートは共に変換されません。
ENT_IGNORE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。 » セキュリティの問題が発生する可能性があります。
ENT_SUBSTITUTE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は � となります。
ENT_DISALLOWED 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは � で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401 コードを HTML 4.01 として処理します。
ENT_XML1 コードを XML 1 として処理します。
ENT_XHTML コードを XHTML として処理します。
ENT_HTML5 コードを HTML 5 として処理します。

$encodingについて

文字セット エイリアス 説明
ISO-8859-1 ISO8859-1 西欧、Latin-1
ISO-8859-5 ISO8859-5 ほとんど使われないキリル文字セット (Latin/Cyrillic)。
ISO-8859-15 ISO8859-15 西欧、Latin-9 。Latin-1(ISO-8859-1) に欠けている ユーロ記号やフランス・フィンランドの文字を追加したもの。
UTF-8 ASCII 互換のマルチバイト 8 ビット Unicode 。
cp866 ibm866, 866 DOS 固有のキリル文字セット。
cp1251 Windows-1251, win-1251, 1251 Windows 固有のキリル文字セット。
cp1252 Windows-1252, 1252 西欧のための Windows 固有の文字セット。
KOI8-R koi8-ru, koi8r ロシア語。
BIG5 950 繁体字中国語。主に台湾で使用。
GB2312 936 簡体字中国語。国の標準文字セット。
BIG5-HKSCS Big5 に香港の拡張を含めた繁体字中国語。
Shift_JIS SJIS, SJIS-win, cp932, 932 日本語。
EUC-JP EUCJP, eucJP-win 日本語。
MacRoman Mac OS で使われる文字セット。
'' 空文字列を指定すると、 スクリプトのエンコーディング (Zend multibyte)、 default_charset、 そして現在のロケール (nl_langinfo() および setlocale()) の順でエンコーディングを検出。この方法は非推奨。

少しキモいと思っているところ

ここでキモいと感じているパターンの書き方を見てみる。
エイリアスを使った書き方である・・・

なんか動く・・・その1
htmlspecialchars($pre_escape, ENT_QUOTES, 'SJIS');
なんか動く・・・その2
htmlspecialchars($pre_escape, ENT_QUOTES, 'SJIS-win');

SJISやSJIS-winというオプションは正確にはないが、エイリアスとして用意されている。
そのため、動きはするが、プロジェクトごとにまとめておかないと、書き方が、たくさん出てくるので、どこかに定数として持たせるか、ラップ用関数を作っておくに越したことはなさそう。

まとめ

他にもエイリアスが適用されているメソッドがPHPにはある模様。エイリアスがあるところは前述の通り、プロジェクトごとにまとめてよしなにやっておかないとつらみが噴出する可能性が否めない。注意が必要。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?