ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルのエスケープ関数の解析

php_PHP チュートリアルのエスケープ関数の解析

WBOY
WBOYオリジナル
2016-07-21 15:02:221351ブラウズ

jsを使用してURL内の中国語文字をエスケープエンコードします。
リンクをクリックした後の時間は次のようになります:
引用: http ://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51
は、PHP の urldecode() や Base64_decode() を使用してデコードできないことは明らかです。 。
解決策は、PHP を使用して逆解関数を作成します:

コードをコピーします コードは次のとおりです:
function js_unescape($str){
$ret = ''; strlen($str ) ) $val);
else if($val 6)&0x3f)).chr(0x80|($val&0x3f)); $i] == '%' )
}
else $ret .= $str[$i];
}
return $ret ;}


JS エンコードは自動的に UTF-8 に変換されるため、正しい結果を得るにはエンコード変換を実行する必要があります。そうしないと中国語の文字が文字化けします。 。ただし、UTF-8 エンコーディングを使用する場合、この手順は必要ありません。

コードは次のとおりです: print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));

この時点で、js のエスケープ エンコーディングを正常にデコードできました。
以下の通り:
さらに、PHPを使用してjsのエスケープエンコーディングを実装する関数を見つけました:



コードをコピー

コードは次のとおりです:

関数 phpescape($str)
{ ($str[$i])>=127) tmpString=substr($tmpString,2,2).substr($tmpString,0,2);これをウィンドウの下に
$retrunString.="%u".$tmpString
} else
{


中国語は json ではサポートされていません。中国語データの送信にのみ使用してください。データの損失や文字化けが発生します。送信する文字列は送信前にエンコードする必要があるため、jsのunescape関数を考慮し、phpにエスケープ関数があればデータをエンコードしてクライアント側でデコードします。より便利になります。
まずはインターネットで検索してください。以下のような php に実装されている多くのエスケープ関数は似ています:



コードをコピーします

コードは次のとおりです:


function phpEscape($str) {
preg_match_all( "/[x80 -xff].|[x01-x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord ($v[0]) $ar[$k] = rawurlencode($v);
else
$ar[$k] = "%u".bin2hex(iconv("GB2312 ","UCS -2",$v));}return join("",$ar);}
この関数は非常にうまく機能しますが、原理を理解していない初心者もいるかもしれません私もそうですが、この機能を使うときにいつも不安を感じています。この機能の原理を説明します。そして、他人のコードを再利用することは巨人の肩の上に立つようなものだと思いますが、他人のコードを理解していなければ、遅かれ早かれ地に落ちることになります。

最初の文:
preg_match_all("/[x80-xff].|[x01-x7f]+/",$str,$r); これは、正規表現を使用して文字列 [x80] 内のすべての文字と一致します。 -xff] は、中国語の文字に一致します。1 つは 16 進数の 80 から ff までの文字で、これはたまたま中国語の文字エンコーディングの最初の文字です。このようにして、漢字を完全に一致させることができます。 Unicode での漢字のエンコードについては、オンラインで検索できます。同様に、[x01-x7f]+英語文字列は、最も古い英語は ASCII エンコードであるため、エンコード値は 128 未満、つまり 16 進数で 01 から 7f まで、「+」は 1 つ以上の文字を表すため、 [x01 -x7f]+ は、複数の連続する英語の文字列と一致します。



コードをコピーします

コードは次のとおりです:

$ar = $r[0]; //$r[0] は一致した配列を格納します
foreach($ar as $k=>$v) {
if(ord($v[0] ) < 128) //文字エンコーディングの値が 128 未満の場合は、英語の文字であることを意味します
hex(iconv("GB2312","UCS-2",$v)); //それ以外の場合は、 iconv 関数は、中国語の文字を ucs-2 エンコーディング (Unicode エンコーディングである ucs-2 エンコーディング) に変換します
}


JavaScript では、unescape を使用して
u0391-uFFE5 と u4e00-u9fa5 をデコードして中国語に一致させることができます
しかし、前者には A- が含まれているようです漢字の下の¥と後者は純粋な漢字である可能性があります。 decoding関数は次のとおりです。コードは次のとおりです{S if (Substr ($ v, 0,2) == "%u")
$ AR [$ k] = iconv ("ucs-2", "gbk", Pack ("h4", substr ($ v ,-4)); H4",substr ($v,3,-1))); ","GBK",pack("n",substr($v,2,-1)));
1. GBK (GB2312/GB18030)

x00-xff GBK の全角エンコード範囲
x20-x7f ASCIIxa1-xff 中国語x80-xff 中国語2. UTF-8 (Unicode)
(中国語)
x3130-x318F (韓国語
xAC00-xD7A3 (韓国語)
u0800-u4e00 (日本語)
ps: 韓国語は [u9fa5] より大きい文字です

通常の例:

preg_replace("/([x80 - xff])/","",$str);
preg_replace("/([u4e00-u9fa5])/","",$str);




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

www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/327931.html
技術記事
js を使用して URL 内の中国語文字をエスケープ エンコードします。 a href="" onclick="window.open('product_list.php?p_sort='+escape('Script Home'));"リンクをクリックした後の効果は次のとおりです: 引用: http://...