[JavaScript]一段把客户端的中文字串转换成UTF-8的代码 开发ASP.NET,我经常要在客户端的javascript代码中使用window.location='WebForm1.aspx?Param1=中文字串'来跳转页面,但在跳转之前必须要把中文字串转换成UTF-8的代码,否则如果中文字串中间存在空格之类的字符就会引起问题。
实际上IE 5.5+,Netscape 6+,Mozilla中已经有了转换函数,即encodeURIComponent,但对于低版本的浏览器则需要一下代码。 /* *************************** ** Most of this code was kindly ** provided to me by ** Andrew Clover (and at doxdesk dot com) ** http://and.doxdesk.com/ ; ** in response to my plea in my blog at ** http://worldtimzone.com/blog/date/2002/09/24 ** It was unclear whether he created it. */ function utf8(wide) { var c, s; var enc = ""; var i = 0; while(i<wide.length) { c= wide.charCodeAt(i++); // handle UTF-16 surrogates if (c>=0xDC00 && c<0xE000) continue; if (c>=0xD800 && c<0xDC00) { if (i>=wide.length) continue; s= wide.charCodeAt(i++); if (s<0xDC00 || c>=0xDE00) continue; c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000; } // output value if (c<0x80) enc += String.fromCharCode(c); else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F)); else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F)); else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F)); } return enc; }
var hexchars = "0123456789ABCDEF";
function toHex(n) { return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF); }
var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
function encodeURIComponentNew(s) { var s = utf8(s); var c; var enc = ""; for (var i= 0; i<s.length; i++) { if (okURIchars.indexOf(s.charAt(i))==-1) enc += "%"+toHex(s.charCodeAt(i)); else enc += s.charAt(i); } return enc; }
function URLEncode(fld) { if (fld == "") return false; var encodedField = ""; var s = fld; if (typeof encodeURIComponent == "function") { // Use javascript built-in function // IE 5.5+ and Netscape 6+ and Mozilla encodedField = encodeURIComponent(s); } else { // Need to mimic the javascript version // Netscape 4 and IE 4 and IE 5.0 encodedField = encodeURIComponentNew(s); } //alert ("New encoding: " + encodeURIComponentNew(fld) + // "\n escape(): " + escape(fld)); return encodedField; }

|