ホームページ >バックエンド開発 >PHPチュートリアル >php5.4以降、htmlspecialcharsの出力が空になる問題

php5.4以降、htmlspecialcharsの出力が空になる問題

WBOY
WBOYオリジナル
2016-06-23 13:36:32857ブラウズ

古いバージョンから php5.4 にアップグレードする場合、最も厄介な問題は htmlspecialchars ではないでしょうか。もちろん htmlentities も影響を受けますが、中国語の Web サイトでは htmlspecialchars を使用するのが一般的であり、htmlentities はほとんど使用されません。

おそらく外国人は、Web ページは一般的に utf-8 でエンコードされるべきだと考えているので、GB2312、GBK エンコードを使用する中国の Web サイトに悩まされているのかもしれません...!

特定のパフォーマンス:

$str = "9enjoy.com の PHP バージョンは 5.2.10";
echo htmlspecialchars($str);

gbk 文字セットでの出力は空です...utf-8 で、出力は正常です。

理由は 5.4.0 でのこの関数の変更です:

5.4.0 エンコーディングパラメータのデフォルト値が UTF-8 に変更されました。

元々は何ですか?

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

変換に使用されるエンコーディングを定義します。省略した場合、この引数のデフォルト値は、PHP 5.4.0 より前のバージョンでは ISO-8859-1 であり、PHP 5.4.0 以降では UTF-8 です。この関数を中国語で使用すると、出力は空白になります。

国内のオープンソース プログラムの多くは 5.4 ではこのような問題が発生する可能性があり、DISCUZ 担当者もユーザーに 5.4 にアップグレードしないことを推奨しています。

解決策:
1. htmlspecialchars を使用するすべてのプログラムを変更します

1.1 2 番目の $flags パラメータはデフォルトで ENT_COMPAT なので、
htmlspecialchars($str,ENT_COMPAT,'GB2312'); に変更します。 GBK パラメーターがないため、強制的に GBK を使用すると、エラーが報告されます:
警告: htmlspecialchars(): charset `gbk' not support, according to utf-8
GBK を使用するには、次のように変更します。
htmlspecialchars($str ,ENT_COMPAT,'ISO-8859-1');

1.2. 同じ手順が変更されますが、パラメータを 1 つ省略できます。
ini_set('default_charset','gbk');
を追加して、それを
htmlspecialchars($str,ENT_COMPAT,'');に変更することができます。
ドキュメントには次のように書かれています: 空の文字列はスクリプトエンコーディングからの検出を有効にします ( Zend マルチバイト)、default_charset、および現在のロケール (nl_langinfo() および setlocale() を参照) の順です。推奨されません。おそらく、空の文字列が渡された場合、default_charset のエンコーディングを使用することを意味します

1.3。 .. もともと、htmlspecialchars という単語は常に覚えるのが困難でした。
function htmlout($str) {
Return htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');
}
その後、一括置換に進みます。

2. ソースコードを直接変更して再コンパイルします。これは私が現在オンラインで取り組んでいる計画でもあります。
ext/standard/html.cを変更します
372行目について
/* デフォルトはUTF-8になりました */
if (charset_hint == NULL)
return cs_utf_8;
cs_utf_8をcs_8859_1に変更します
/* デフォルトはUTF-8になりました*/
if (charset_hint == NULL)
return cs_8859_1;
コンパイル後、元のプログラムを調整する必要はありません。
インストール方法については、http://www.9enjoy.com/linux-upgrade-php54/を参照してください。

Windowsではどうすればよいですか?これは、自分でコンパイルする方法を見つけることができますが、非常に困難です...
参考として Web サイトを提供します: http://www.phpvim.net/web/php/build-php5-4-and-xdebug- on-win32.html
彼の言葉を引用すると: コーヒーとコーラを用意してください、準備してください、何時間もかかるかもしれません...




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。