`
marc0658
  • 浏览: 80390 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

encode

阅读更多
1.       使用 JS 中的 encodeURIComponent 或 encodeURI 方法。

说明:



encodeURIComponent(String)

对传递参数进行设置。不编码字符有 71 个: ! , ' , ( , ) , * , - , . , _ , ~ , 0-9 , a-z , A-Z 。

例:

var url = “<a href=’http://cancait.blog.163.com/name=” + encodeURIComponent(“ 中国 ”) + “’> 中国 </a>”;



encodeURI(String)

对 URL 整体转换。不编码字符有 82 个: ! , # , $ , & , ' , ( , ) , * , + ,,, - , . , / , : , ; , = , ? , @ , _ , ~ , 0-9 , a-z , A-Z 。

例:

var url = “<a href=’” + encodeURI(“http://cancait.blog.163.com/name= 中国 ”) + “’> 中国 </a>”;



乱码处理实例:

/////////////////////////////////////////////////////////////////////////////////////

初始页面内容如下 (hello.jsp) :

/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
     <title>AJAX 提交页面 </title>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <script type="text/javascript">
     function justdo(){
   var post="name= 王力猛 &email=wallimn@sohu.com&bokee=http://wallimn.bokee.com ";
   post = encodeURI(post);
   post = encodeURI(post);// 两次,很关键
   var xmlObj = new ActiveXObject('Msxml2.XMLHTTP');
   var URL = '<%= path%>/page/act.jsp';// 文件名需要调整成测试时的相应位置 ?
   xmlObj.open ('post' , URL , true);
   xmlObj.setrequestheader("cache-control" , "no-cache");
   xmlObj.setrequestheader("Content-Type" , "application/x-www-form-urlencoded");
   xmlObj.send (post);// 注意OST 方式,使用这个来发送内容 ?
    }
    </script>
   </head> 
   <body>
   <input type="button" value=" 提交 " onclick="justdo()"/>
    </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////
   ajax 请求处理页面( act.jsp )的内容如下 :
/////////////////////////////////////////////////////////////////////////////////////
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%String path = request.getContextPath();%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< %@page import="java.net.URLDecoder"%>
<html>
   <head>
     <title>ajax deal</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">   
   </head>
   <body>
   <%
   // 遍历输出参数内容。
   for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
    String h = (String) e.nextElement();
    String v = request.getParameter(h);
    String mm =   java.net.URLDecoder.decode(v , "UTF-8");
    System.out.println(" 请求参数 : " + h + " = " + mm);
   }
    %>
   </body>
</html>
/////////////////////////////////////////////////////////////////////////////////////



说明:

java.net.URLencode 和 java.net.URLDecode 分别对应于 JavaScript 中的 encodeURI 和 decodeURI 、 encodeURIComponent 和 decodeURIComponent.



为什么要连续两次调用 encodeURI(String) 方法呢?是因为 Java 中的 request.getParameter(String) 方法会进行一次 URI 的解码过程,调用时内置的解码过程会导致乱码出现。而 URI 编码两次后, request.getParameter(String) 函数得到的是原信息 URI 编码一次的内容。接着用 java.net.URLDecoder.decode(String str,String codename) 方法,将已经编码的 URI 转换成原文。

2.       使用 JS 中的 escape 方法。

说明:

escape(String)

对 0-255 以外的 unicode 值进行编码时输出 %u**** 格式,其它情况下 escape , encodeURI , encodeURIComponent 编码结果相同。

例:

var url = “<a href=’http://cancait.blog.163.com/name=” + escape (“ 中国 ”) + “’> 中国 </a>”;



乱码处理实例:

/////////////////////////////////////////////////////////////////////////////////////

例子跟上面一样。只有这里不同。

(hello.jsp)

post = escape(post);
   post = escape (post);// 两次,很关键

      

(act.jsp)

String h = (String) e.nextElement();
    String v = request.getParameter(h);
String mm =   EscapeUnescape.unescape( v , "UTF-8");
    System.out.println(" 请求参数 : " + h + " = " + mm);


/////////////////////////////////////////////////////////////////////////////////////

(EscapeUnescape.java)Java 中的 escape 和 unescape. 内容如下:

/////////////////////////////////////////////////////////////////////////////////////


package cn.kgnews.util;



public class EscapeUnescape {

public static String escape(String src) {

int i;

char j;

StringBuffer tmp = new StringBuffer();

tmp.ensureCapacity(src.length() * 6);



for (i = 0; i < src.length(); i++) {



        j = src.charAt(i);

      

        if (Character.isDigit(j) || Character.isLowerCase(j)

                || Character.isUpperCase(j))

        tmp.append(j);

        else if (j < 256) {

        tmp.append("%");

                if (j < 16)

                tmp.append("0");

        tmp.append(Integer.toString(j , 16));

        } else {

        tmp.append("%u");

        tmp.append(Integer.toString(j , 16));

        }

        }

return tmp.toString();

}



public static String unescape(String src) {

StringBuffer tmp = new StringBuffer();

tmp.ensureCapacity(src.length());

int lastPos = 0 , pos = 0;

char ch;

while (lastPos < src.length()) {

        pos = src.indexOf("%" , lastPos);

        if (pos == lastPos) {

                if (src.charAt(pos + 1) == 'u') {

                ch = (char) Integer.parseInt(src

                        .substring(pos + 2 , pos + 6) , 16);

                tmp.append(ch);

                lastPos = pos + 6;

                } else {

                ch = (char) Integer.parseInt(src

                        .substring(pos + 1 , pos + 3) , 16);

                tmp.append(ch);

                lastPos = pos + 3;

                }

        } else {

                if (pos == -1) {

                tmp.append(src.substring(lastPos));

                lastPos = src.length();

                } else {

                tmp.append(src.substring(lastPos , pos));

                lastPos = pos;

                }

        }

        }

return tmp.toString();

}

}



/////////////////////////////////////////////////////////////////////////////////////


说明:

EscapeUnescape.java 类是 Java 中的 escape 和 unescape 。

原理跟上例一样。



3.       用 JavaScript 实现 java 中的 URLencode 跟 URLdecode.

说明:

这种方法服务器端代码不必修改。直接 request.getParameter() 来获取就可以了。



JavaScript 中的 URLencode 跟 URLdecode 实现如下:



/////////////////////////////////////////////////////////////////////////////////////

(UrlEncodeUrlDecode_gecko.js) 非 IE 实现方法如下:

完整代码可到这里下载:

http://www.blueidea.com/user/qswh/qswhU2GB.js

/////////////////////////////////////////////////////////////////////////////////////

var qswhU2GB = […..]; // 此数组为 GB Unicode 对照表



function UrlEncode(str){

var i , c , ret="" , strSpecial="!\"#$%&'()*+ , /:;<=>?@[\]^`{|}~%";

for(i=0;i<str.length;i++){

if(str.charCodeAt(i)>=0x4e00){

        c=qswhU2GB[str.charCodeAt(i)-0x4e00];

        ret+="%"+c.slice(0 , 2)+"%"+c.slice(-2);

        }

else{

        c=str.charAt(i);

        if(c==" ")

        ret+="+";

        else if(strSpecial.indexOf(c)!=-1)

        ret+="%"+str.charCodeAt(i).toString(16);

        else

        ret+=c;

        }

}

return ret;

}

function UrlDecode(str){

var i , c , d , t , p , ret = "";

function findPos(str){

for(var j = 0; j < qswhU2GB.length; j++){

        if(qswhU2GB[j] == str){

        return j;

        }

        }

return -1;

}



for(i = 0;i < str.length;){

        c = str.charAt(i);i++;

if(c != "%"){

        if(c == "+"){

        ret += " ";

        }else{

        ret += c;

        }

}else{

        t = str.substring(i , i+2);i += 2;

        if(("0x" + t) > 0xA0){

                d = str.substring(i+1 , i+3);i += 3;

                p = findPos(t + d);

        if(p != -1){

                ret += String.fromCharCode(p + 0x4e00);

                }

        }else{

        ret += String.fromCharCode("0x" + t);

        }

        }

}

return ret;

}



function getSpell(str , sp){

var i , c , t , ret="";

if(sp==null)sp="";

for(i=0;i<str.length;i++){

if(str.charCodeAt(i)>=0x4e00){

        c=parseInt(qswhU2GB[str.charCodeAt(i)-0x4e00] , 16);

        if(c<55290){

        for(t=qswhSpell.length-1;t>0;t=t-2)if(qswhSpell[t]<=c)break;

        if(t>0)ret+=qswhSpell[t-1]+sp;

        }

        }

}

return ret.substr(0 , ret.length-sp.length);

}



/////////////////////////////////////////////////////////////////////////////////////

(UrlEncodeUrlDecode_ie.js)IE 实现方法如下:

/////////////////////////////////////////////////////////////////////////////////////

function UrlEncode(str) {

var ret = "";

var strSpecial = " ~!\"#$%&'()*+- , /:;<=>?[]^`{|}~%";

for (var i = 0; i < str.length; i++) {

var chr = str.charAt(i);

strstr = chr;

execScript("c = hex(asc(strstr))" , "VBScript");

        if (parseInt("0x" + c) > 127) {

        ret += "%" + c.slice(0 , 2) + "%" + c.slice(-2);

        } 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) > 127) {

                temp = parseInt("0x" + asc + str.substring(i + 4 , i + 6));

                execScript("rt = chr(temp)" , "VBScript");

                ret += rt;

                i += 5;

                } else {

                temp = parseInt("0x" + asc);

                execScript("ret = ret + chr(temp)" , "VBScript");

                i += 2;

                }

        } else {

        ret += chr;

        }

        }

}

return ret;

}



/////////////////////////////////////////////////////////////////////////////////////

(loadcssorjs.js) 自动识别浏览器动态导入 JS/CSS

实现方法如下:

/////////////////////////////////////////////////////////////////////////////////////

/*

CopyRight(C)CAnca Software Office.

Created by CAnca.2007.9.4

*/



function LoadScript(url) {

document.write("<scr" + "ipt type=\"text/javascript\" src=\"" + url + "\" onerror=\"alert('Error loading ' + this.src);\"></scr" + "ipt>");

}

function LoadCss(url) {

document.write("<link href=\"" + url + "\" type=\"text/css\" rel=\"stylesheet\" onerror=\"alert('Error loading ' + this.src);\" />");

}





var sSuffix = /msie/.test(navigator.userAgent.toLowerCase()) ? "ie" : "gecko";

LoadScript("js/UrlEncodeUrlDecode_" + sSuffix + ".js");



使用方法:

将三个 JS 文件放在同目录。在页面导入 loadcssorjs.js 。在要进行编码的地方使用 UrlEncode 方法即可。

例:

//index.html

<html>

<head>

<script language=”javascript” src=”js/loadcssorjs.js”></script>

<script language=”javascript”>

        var url = “ http://cancait.blog.163.com/name= ” + UrlEncode (“ 中国人 ”);

        window.open(url);

</script>

</head>

<body>

…..

</body>

</html>



三种解决方案的比较:



第一种, 在服务器端需要一次 java.net.URLdecode(String) 转码。使用起来,不太方便。

第二种, 要建立 Java 版的 escape 跟 uncape 。在服务器端还是需要一次 uncape 转码。使用起来,不太方便。

第三种, 是最方便的一种方法。只需要客户端进行编码。服务器端可以不做任何修改。唯一缺点的是: firefox 浏览网页时,要加载一个 150K 的 UrlEncodeUrlDecode_gecko.js 文件。影响了浏览速度。(但本人还是推荐使用这方案。)



总结:

当然, Ajax 实现不乱码,可以不用这三种方案,用这三种方案,只是迫不得已的做法。通常造成乱码的原因有以下几点:

1. xmlhttp  返回的数据默认的字符编码是 utf-8 ,如果前台页面是 gb2312 或者其它编码数据就会产生乱码。

2. post 方法提交数据默认的字符编码是 utf-8 ,如果后台是 gb2312 或其他编码数据就会产生乱码。



解决方法:



推荐方法:由于 Javascript 沿用 java 的字符处理方式,内部是使用 unicode 来处理所有字符的。 前台后台都用 utf-8 编码,这样可以省不少麻烦,从根本上解决了乱码问题 . 优点是效率高,而且符合目前的形式, utf-8 编码本身就是一种比较优秀的编码,没有语言限制 . 缺点只能调用自己的后台编码或者其他的 utf-8 的编码。



前台更改为



<meta http-equiv="Content-Type" content="text/html; charset=utf-8">



后台 asp 中第一行加入如下代码

span
分享到:
评论

相关推荐

    HtmlEncode编码与解码用法定义

    ### HtmlEncode与HtmlDecode编码及解码用法详解 #### 一、HtmlEncode与HtmlDecode概念解析 在Web开发中,经常会遇到需要处理HTML代码的情况。为了确保网页内容的正确显示以及防止潜在的安全威胁(如XSS攻击),...

    encode.rar_15 11汉明码_Matlab中encode_breakfastarr_matlab里encode_(1

    这个压缩包文件“encode.rar_15 11汉明码_Matlab中encode_breakfastarr_matlab里encode_(1”包含了使用MATLAB实现(15,11)汉明码编码和解码过程的资源。 MATLAB是一款强大的数学计算软件,广泛应用于科研和工程...

    jpeg-encode.zip_jpeg_jpeg encode_jpeg encode linux_linux视频监控_视频监

    标题中的“jpeg-encode.zip_jpeg_jpeg encode_jpeg encode linux_linux视频监控_视频监”表明这个压缩包可能包含了一组用于在Linux环境下进行JPEG编码的工具或代码库,特别适用于资源有限的嵌入式系统,例如视频监控...

    VB Script EnCode 解密程序

    VB Script EnCode是一种在VBScript(Visual Basic Script)编程环境中使用的加密技术,它允许程序员对源代码进行编码,以防止未经授权的用户查看或修改代码。VBScript是Microsoft开发的一种脚本语言,常用于Web页面...

    encode加密解密.rar

    《深入理解encode加密解密技术》 在信息技术领域,数据安全是至关重要的议题,而加密技术则是保护数据安全的重要手段。本文将详细探讨encode加密解密的概念、原理以及实际应用,旨在帮助读者全面理解这一技术。 一...

    MD5Encode签名加密文件

    在本场景中,"MD5Encode签名加密文件"指的是使用MD5算法对数据进行编码并生成签名的过程,这通常与软件安全、数据验证和防止篡改有关。在小程序的开发中,签名机制是确保应用安全性和数据完整性的重要手段。 MD5...

    易语言encode加密解密

    在易语言中进行encode加密解密是一项重要的安全技术应用,它涉及到数据的保护和隐私的安全。 易语言encode加密是将原始数据转换为无法轻易识别的密文过程,目的是为了防止未经授权的访问或篡改。常见的加密算法有...

    PHP json_encode() 和 json_decode()

    例如,如果你有一个关联数组,你可以使用 `json_encode()` 将其转化为JSON字符串: ```php $data = array( 'name' =&gt; 'John Doe', 'age' =&gt; 30, 'city' =&gt; 'New York' ); $json = json_encode($data); ``` 在...

    Encode-Detect-1.01.tar.gz

    "Encode-Detect-1.01.tar.gz" 是一个压缩包文件,通常在Linux或Unix-like操作系统中使用,用于集合多个文件或目录并压缩成一个单一的可传输或存储的文件。这种格式结合了tar(归档)和gzip(压缩)两个工具的功能,...

    MD5Encode.rar

    MD5Encode.ncb、MD5Encode.sln、MD5Encode这三个文件名可能是该工程的相关组件: 1. MD5Encode.ncb:这是Visual Studio的旧版项目数据库文件,包含了一些关于项目结构和配置的元数据,帮助IDE提供代码完成和其他功能...

    MusicEncode.rar_51 两只老虎_music encode_单片机音乐简谱

    本项目“MusicEncode.rar_51 两只老虎_music encode_单片机音乐简谱”就是一个基于51单片机的音乐代码生成器,它能够将音乐的简谱转化为单片机可以理解的代码,进而通过单片机的蜂鸣器或扬声器播放音乐。下面我们将...

    EncodeDecode & ANSI-UTF8编码转换工具

    "EncodeDecode & ANSI-UTF8编码转换工具"是一款专门用于解决这个问题的软件,它能够帮助用户将文本数据从ANSI编码转换为UTF-8编码,反之亦然。这两种编码方式在不同的上下文中有各自的适用性,理解它们的差异和用途...

    EnCode/DeCode转换工具

    EnCode/DeCode转换工具是一款专门针对这一需求设计的小巧实用软件,它能够处理ANSI和UTF-8这两种常见的字符编码格式,帮助开发者解决字符转换的问题。 首先,我们要理解编码与解码的基本概念。编码是将可读的文本...

    TextEncode.zip

    "TextEncode.zip" 提供的工具显然聚焦于将文本转化为十六进制(Hexadecimal)形式,并能进行相应的解密操作。下面将详细探讨这个主题。 首先,我们来理解什么是文本编码。在计算机系统中,文本是以二进制形式存储的...

    由时间空间成对组成的轨迹序列+lstm+自编码器auto-encode+时空密度聚类st-dbscan异常检测源码.zip

    【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为...由时间空间成对组成的轨迹序列+循环神经网络lstm+自编码器auto-encode+时空密度聚类st-dbscan做异常检测(源码+项目说明).zip

    encode-lib.zip

    "encode-lib.zip" 提供了一个专门用于微信小程序的编码转化库,其主要功能是将字符串转换为GBK编码的字节流。GBK编码是GB2312编码的扩展,兼容了更多的汉字和其他字符,广泛应用于中文系统中。 GBK编码是一种双字节...

    Asp VBScript.Encode 脚本批量解密.rar

    在ASP中,`VBScript.Encode`是一个非常重要的函数,它用于对VBScript代码进行加密,以防止恶意用户查看或篡改源代码。这个过程被称为编码,而不是传统意义上的加密,因为编码后的代码仍然是可执行的,但对非技术用户...

    加密解密文本文件的一个另外简单方法encode

    标题提到的"encode"通常指的是编码过程,这在加密解密中扮演着关键角色。本文将详细介绍加密解密的基本概念,以及可能用于文本文件的简单方法。 1. 加密:加密是一种将明文(可读格式)转换为密文(不可读格式)的...

    MPEG4_ENCODE_SRC

    《MPEG4_ENCODE_SRC——多媒体编码技术的源码解析》 在数字媒体领域,编码技术是至关重要的一个环节,它关系到数据的压缩、传输和存储效率。MPEG4编码技术,作为国际标准之一,因其高效能和灵活性,被广泛应用于...

    RSA_encodedecode.zip

    本项目提供的"RSA_encodedecode.zip"是一个C语言实现的RSA加密解密工具,包含测试代码和Makefile,方便用户直接编译运行。 在RSA算法中,主要涉及到两个关键概念:公钥和私钥。公钥是公开的,任何人都可以获取,...

Global site tag (gtag.js) - Google Analytics