最初はこんな感じでした
$str = iconv('UTF-8', 'GB2312', unescape(isset($_GET['str'])? $_GET['str']:''));
オンラインになった後、次のようなエラーが大量に報告されました: iconv(): Detected an evilcharacter in input string
GB2312 文字セットが比較的小さいことを考慮して、より大きな文字セットに変更しましょう。そこで GBK に変更しました。 :
$str = iconv('UTF-8', 'GBK', unescape(isset($_GET['str'])? $_GET['str']:''));
依然として同じエラーが発生しますオンラインになったら!
マニュアルをよく読んで、次の段落を見つけてください。
out_charset に文字列 //TRANSLIT を追加すると、音訳が有効になります。これは、文字がターゲットの文字セットで表現できない場合、1 つまたは複数の文字セットで近似できることを意味します。同様に見える文字。文字列 //IGNORE を追加すると、ターゲットの文字セットで表現できない文字は自動的に破棄されます。それ以外の場合、str は最初の不正な文字から切り取られます。
$str = iconv( ' UTF-8', 'GBK//IGNORE', unescape(isset($_GET['str'])? $_GET['str']:''));
ローカルテスト//IGNORE はそれを無視して実行できます認識されない 文字は下方向に転送され、エラーは報告されませんが、 //TRANSLIT は認識できない単語とその背後にあるコンテンツを切り捨てて、エラーを報告します。 //IGNORE が必要です。
あとは、オンラインに接続して結果を確認するまで待ちます (これは良い考えではありません。マニュアルをよく読んでオンラインで検索してください)、笑。 。 。
インターネットで次の記事を見つけたところ、mb_convert_encodingも使用できることがわかりましたが、効率はiconvよりも悪いです。
文字列エンコーディングの変換 iconv と mb_convert_encoding の違い
iconv — 文字列を要求された文字エンコーディングに変換します(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — 文字エンコーディングを変換します(PHP 4 >= 4.0) .6、PHP 5)
使用法:
string mb_convert_encoding ( string str, string to_encoding [,mixed from_encoding] )
まず mbstring 拡張ライブラリを有効にし、php の extension=php_mbstring.dll の前にある ; を削除する必要があります。 .ini
string iconv (string in_charset, string out_charset, string str)
注:
2 番目のパラメーターは、変換先のエンコーディングを指定することに加えて、2 つのサフィックスを追加することもできます: //TRANSLIT と //IGNORE,
ここで:
//TRANSLIT は、直接変換できない文字を 1 つ以上の近似文字に自動的に変換します。
//IGNORE は変換できない文字を無視し、デフォルトの効果は最初の不正な文字から切り捨てられます。
変換された文字列、または失敗した場合は FALSE を返します。
使用法:
1. iconv は文字「-」を gb2312 に変換するときにエラーが発生することがわかりました。ignore パラメーターがないと、この文字に続くすべての文字列を保存できません。この「-」はどうやってもうまく変換できず出力できません。さらに、mb_convert_encoding にはこのバグはありません。
2. mb_convert_encoding は、内容に基づいて自動的に認識される複数の入力エンコーディングを指定できます。ただし、実行効率は、次のように劣ります。 ,"euc-jp"," ASCII, JIS, EUC-JP, SJIS, UTF-8"); 「ASCII, JIS, EUC-JP, SJIS, UTF-8」の順番で効果が異なります
3.通常は iconv を使用しますが、元のエンコーディングが特定できない場合、または変換後に iconv が正常に表示されない場合にのみ mb_convert_encoding 関数を使用します
from_encoding は変換前の文字コード名で指定します。配列または文字列 - カンマで指定できます。指定されていない場合は、分割された列挙リストが使用されます。
$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
$str = mb_convert_encoding($str, "EUC-JP ', "auto");
例:
$content = iconv("GBK", "UTF-8", $content);
$content = mb_convert_encoding($content, " UTF-8"、GBK") ;