PHP中国語URLコーデック(urlencode()rawurlencode()

4104 ワード

以下に詳細を説明します:///\
string urlencode ( string str)
-を除く文字列を返します.以外のすべてのアルファベット以外の文字はパーセント(%)に置き換えられ、2桁の16進数に続き、スペースはプラス(+)に符号化されます.この符号化は、WWWフォームPOSTデータの符号化方式と同様であり、アプリケーション/x-www-form-urlencodedのメディアタイプ符号化方式と同様である.履歴上、この符号化は、RFC 1738符号化(rawurlencode()を参照)とは異なり、スペースをプラス記号(+)に符号化する.この関数は、文字列を符号化してURLの要求部分に使用するのに便利であり、変数を次のページ:例1に渡すのに便利である.urlencode()の例
 
  
echo ''; ?>

注意:HTMLエンティティに一致する変数に注意してください.像&、© および:ブラウザによって解析され、期待される変数名の代わりに実際のエンティティが使用されます.これは明らかな混乱で、W 3 Cは何年も人々に警告してきた.参照先:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHPがarg_を通過separator .iniコマンドは、パラメータ分割子をW 3 Cに変更することを推奨するセミコロンをサポートします.残念なことに、ほとんどのユーザーエージェントは、セミコロン区切り記号形式のフォームデータを送信しません.比較的簡単な解決策は、&の代わりに&を区切り文字として使用することです.PHPのargを修正する必要はありませんseparator.htmlentities(urlencode($data))のみを使用してURLを符号化します.
例2.urlencode()とhtmlentities()の例
 
  
echo ''; ?>

string urlencode ( string str)
-を除く文字列を返します.以外のすべてのアルファベット以外の文字は、パーセント(%)に置き換えられ、2桁の16進数になります.これは、RFC 1738に記載された符号化であり、特定のURLデリミタとして解釈されないように原義文字を保護するとともに、伝送媒体(一部のメールシステムのように)が文字変換を使用して混乱しないようにURLフォーマットを保護するためである.たとえば、FTPのURLにパスワードを含めたい場合は、次のようになります.
例1.rawurlencode()例1
 
  
echo ''; ?>

あるいは、URLのPATH_を通してINFO構成部は情報を伝達する:
例2.rawurlencode()例2
 
  
echo ''; ?>

復号化には、対応するurldecode()およびrawurldecode()を使用することができ、それに応じて、rawurldecode()はプラス記号('+')をスペースに復号せず、urldecode()を使用することができる.次の例を示します.
string urldecode ( string str)
与えられた符号化文字列の任意の%##を復号します.復号された文字列を返します.例1.urldecode() example
 
  
$a = explode('&', $QUERY_STRING);
$i = 0;
while ($i < count($a)) {
$b = split('=', $a[$i]);
echo 'Value for parameter ', htmlspecialchars(urldecode($b[0])),
' is ', htmlspecialchars(urldecode($b[1])), "
n";
$i++;
}
?>

string rawurldecode ( string str)
文字列を返します.この文字列のパーセンテージ(%)の後、2つの16進数のシーケンスが元の文字に置き換えられます.
例1.rawurldecode()の例
 
  
echo rawurldecode('foo%20bar%40baz'); // foo bar@baz
?>

ただし、urldecode()とrawurldecode()で復号された文字列はUTF-8形式の符号化であり、URLに中国語が含まれている場合、ページ設定がUTF-8でない場合は、復号された文字列を変換してこそ、正しく表示されることに注意してください.
もう1つの問題は、取得したURLが%%nn n={0..F}のフォーマットではなく、%unnnn n={0..F}のフォーマットである場合、urldecode()とrawurldecode()を使用すると正しく復号できませんが、次の関数で正しく復号できます.
 
  
function utf8RawUrlDecode ($source)
{
$decodedStr = "";
$pos = 0;
$len = strlen ($source);
while ($pos < $len) {
$charAt = substr ($source, $pos, 1);
if ($charAt == '%') {
$pos++;
$charAt = substr ($source, $pos, 1);
if ($charAt == 'u') {
// we got a unicode character
$pos++;
$unicodeHexVal = substr ($source, $pos, 4);
$unicode = hexdec ($unicodeHexVal);
$entity = "". $unicode . ';';
$decodedStr .= utf8_encode ($entity);
$pos += 4;
}
else {
// we have an escaped ascii character
$hexVal = substr ($source, $pos, 2);
$decodedStr .= chr (hexdec ($hexVal));
$pos += 2;
}
} else {
$decodedStr .= $charAt;
$pos++;
}
}
return $decodedStr;
}