ホームページ > バックエンド開発 > PHPチュートリアル > php5.4以降のGBKエンコードでhtmlspecialcharsの出力が空になる問題の解決策まとめ、htmlspecialchars_PHPチュートリアル

php5.4以降のGBKエンコードでhtmlspecialcharsの出力が空になる問題の解決策まとめ、htmlspecialchars_PHPチュートリアル

WBOY
リリース: 2016-07-13 09:58:02
オリジナル
981 人が閲覧しました

php5.4 以降の GBK エンコーディングで htmlspecialchars の出力が空になる問題の解決策のまとめ htmlspecialchars

最も厄介な問題は 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 です。
ISO-8859-1 であることが判明しましたが、5.4 以降はデフォルトで utf-8 になりました。この関数を中国語で使用すると、出力は空白になります。

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

解決策:

1. htmlspecialchars を使用するすべてのプログラムを修正するよう努めます

1.1 2 番目の $flags パラメータのデフォルトは ENT_COMPAT なので、

に変更されます


コードをコピーします コードは次のとおりです: htmlspecialchars($str,ENT_COMPAT,'GB2312');
なぜGBKではないのでしょうか? GBK パラメータがないため、強制的に GBK を使用すると、エラーが報告されます:


コードをコピーします コードは次のとおりです: 警告: htmlspecialchars(): utf-8 を想定した場合、文字セット `gbk' はサポートされていません
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 という単語はいつも覚えにくいです。


コードをコピーします コードは次のとおりです: 関数 htmlout($str) { 戻り値 htmlspecialchars($str,ENT_COMPAT,'ISO-8859-1');
}

次に一括置換に進みます。

2. ソースコードを直接変更して再コンパイルします。これは私が現在オンラインで取り組んでいる計画でもあります。

ext/standard/html.cを変更

372行目について


コードをコピーします コードは次のとおりです: /* デフォルトは UTF-8 になりました */ if (charset_hint == NULL)
cs_utf_8 を返します;

cs_utf_8 を cs_8859_1 に変更します


コードをコピーします コードは次のとおりです: /* デフォルトは UTF-8 になりました */ if (charset_hint == NULL)
cs_8859_1 を返す;

コンパイル後、元のプログラムを調整する必要はまったくありません。
インストール方法については、http://www.bkjia.com/article/63388.htmを参照してください

Windows では何をすればよいですか?これを自分でコンパイルする方法を見つけてみましょう、なかなか難しいです…

参照用の URL を提供します: http://www.bkjia.com/article/63391.htm

彼の言葉を引用すると、コーヒーとコーラを用意してください、準備をしてください、何時間もかかるかもしれません...

http://www.bkjia.com/PHPjc/978728.html

tru​​ehttp://www.bkjia.com/PHPjc/978728.html技術記事 php5.4以降のGBKエンコードでhtmlspecialcharsの出力が空になる問題の解決策まとめ htmlspecialcharsを旧バージョンからphp5.4にバージョンアップした際、一番困るのはhtmlspecialcharsではないかと思います…
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート