ASP (Server.UrlEncode) や PHP (urlencode()) 関数のエンコード結果、または asp や php などの動的言語を介して COOKIES に直接書き込まれた漢字については、JS で読み込むと、エンコーディング 問題は、最終的な文字列が urlencode によってエンコードされており、クライアント側の JS からこのデータを読み取る必要がある場合があることです。
この記事では、システム独自の関数を使用して js でこの問題を解決する方法について簡単に説明します。
この問題に遭遇した友人なら、この問題について何か知っているはずだと思います。現在、この問題を解決するために、vbscript (URLDecode())、javascript (UrlDecode()) など、js のいくつかのカスタム関数がインターネット上で普及しています。等これら 2 つの関数はいずれも、asp (Server.UrlEncode) および php (urlencode()) と相互に適切に通信できません。
vbscript (関数 URLDecode()) と javascript (関数 UrlDecode()) についてもこの記事の最後に再掲します。
この記事の主役は JavaScript (UrlDecodedecodeURIComponent()) です。この関数名はあまりにもありふれていて、個人的にはよくわかりません。結局、js にはシステム関数がたくさんあり、見逃しがちです。心配は偶然この機能を発見しました!
エンコード関数: encodeURIComponent()
デコード関数: decodeURIComponent()
decodeURIComponent() 構文
decodeURIComponent(URIstring) 参 数:(URIstring)必需。一个字符串,含有编码 URI 组件或其他要解码的文本。 返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
例:
<script type="text/javascript"> var test1="烦恼"; var test2="%E7%83%A6%E6%81%BC"; document.write("编码(原="+test1+"):"+encodeURIComponent(test1)+ "<br />"); document.write("解码(原="+test2+"):"+decodeURIComponent(test2)); </script>
結果:
编码(原=烦恼):%E7%83%A6%E6%81%BC 解码(原=%E7%83%A6%E6%81%BC):烦恼
注: この記事は UTF-8 エンコード環境でのみテストされています。エンコード環境が異なると、ASP のコンパイルされたコード (Server.UrlEncode) が異なるように見えるため、テストする必要があります。
添付再版:
vbscript (function URLDecode())
<script type="text/VBscript"> <!-- Function URLDecode(enStr) dim deStr,strSpecial dim c,i,v deStr="" strSpecial="!""#$%&'()*+,.-_/:;<=>?@[\]^`{|}~%" for i=1 to len(enStr) c=Mid(enStr,i,1) if c="%" then v=eval("&h"+Mid(enStr,i+1,2)) if inStr(strSpecial,chr(v))>0 then deStr=deStr&chr(v) i=i+2 else v=eval("&h"+ Mid(enStr,i+1,2) + Mid(enStr,i+4,2)) deStr=deStr & chr(v) i=i+5 end if else if c="+" then deStr=deStr&" " else deStr=deStr&c end if end if next URLDecode=deStr End function //--> </script>
javascript (function UrlDecode()) は、javascript 環境では、str.charCodeAt などの asc、hex、chr 関連の変換に実際に vbscript をソフトに使用しているようです。 ( 0).toString(16) および String.fromCharCode(str) 異なるエンコーディングでは、中国語のエンコーディング結果は均一ではありません。
例: vbscript str2asc/asc2str
<script type="text/vbscript"> Function str2asc(strstr) str2asc = hex(asc(strstr)) End Function Function asc2str(ascasc) asc2str = chr(ascasc) End Function MsgBox str2asc("a") MsgBox asc2str("&H61")'16进制转的61 转到 10进制就是 97 </script>
javascript str2asc/asc2str
<script type="text/javascript"> function str2asc(str){ return str.charCodeAt(0).toString(16); } function asc2str(str){ return String.fromCharCode(str); } alert(str2asc("a"));// alert(asc2str("0x61"));// </script>
デモ:
<script type="text/vbscript"> Function str2asc(strstr) str2asc = hex(asc(strstr)) End Function Function asc2str(ascasc) asc2str = chr(ascasc) End Function </script> <script type="text/javascript"> /*这里开始时UrlEncode和UrlDecode<a href="/?tag=%E5%87%BD%E6%95%B0" target="_blank">函数</a>*/ function UrlEncode(str){ var ret=""; var strSpecial="!\"#$%&'()*+,/:;<=>?[]^`{|}~%"; var tt= ""; for(var i=0;i<str.length;i++){ var chr = str.charAt(i); var c=str2asc(chr); tt += chr+":"+c+"n"; if(parseInt("0x"+c) > 0x7f){ ret+="%"+c.slice(0,2)+"%"+c.slice(-2); }else{ if(chr==" ") ret+="+"; else if(strSpecial.indexOf(chr)!=-1) ret+="%"+c.toString(16); else ret+=chr; } } return ret; } function UrlDecode(str){ var ret=""; for(var i=0;i<str.length;i++){ var chr = str.charAt(i); if(chr == "+"){ ret+=" "; }else if(chr=="%"){ var asc = str.substring(i+1,i+3); if(parseInt("0x"+asc)>0x7f){ ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6))); i+=5; }else{ ret+=asc2str(parseInt("0x"+asc)); i+=2; } }else{ ret+= chr; } } return ret; } alert(UrlDecode("%C2%D2%C2%EB")); </script>
decodeURIComponent を使用した Javascript での urlencode エンコードおよびデコード方法の詳細については、PHP 中国語 Web サイトに注目してください。