`
xuantian868
  • 浏览: 31099 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

js 编码相关

阅读更多
js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent

1、  传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。                          

例如:

<script language="javascript">document.write('<a href="">退出</a>');</script>
2、  进行url跳转时可以整体使用encodeURI

例如: Location.href=encodeURI(=中国asp之家&ct=21);
3、  js使用数据时可以使用escape

例如:搜藏中history纪录。

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

最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)

(中国asp之家注:就是说如果你的页面编码是gb2312的话,服务器端接收的将是乱码)

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

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

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

附上这个三个函数的介绍:

escape 方法

对 String 对象编码以便它们能在所有计算机上可读,

escape(charString)
必选项 charstring 参数是要编码的任意 String 对象或文字。

说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。

字符值大于 255 的以 %uxxxx 格式存储。

注意   escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。

encodeURI 方法

将文本字符串编码为一个有效的统一资源标识符 (URI)。

encodeURI(URIString)
必选的 URIString 参数代表一个已编码的 URI。

说明
encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。

encodeURIComponent 方法

将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。

encodeURIComponent(encodedURIString)
必选的 encodedURIString 参数代表一个已编码的 URI 组件。

说明

encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串。因为 encodeURIComponent 方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。如果字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行


js base64编码 可以使用jquery.base64.js
$.base64.encode("ssss");//编码
$.base64.decode("23sdf=sfAdfiw") //解码


java中的base64 编码与解码
 /** 
     * 编码 
     * @param bstr 
     * @return String 
     */  
    public static String encode(byte[] bstr){  
    	
    	return new sun.misc.BASE64Encoder().encode(bstr);  
    }  
  
    /** 
     * 解码 
     * @param str 
     * @return string 
     */  
    public static String decode(String str){  
	    byte[] bt = null;  
	    try {  
	        sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();  
	        bt = decoder.decodeBuffer(str);  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	    }  
        try {
			return new String(bt,"utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		return "";
    }  



当你用FLASH和xml结合做网站应用程序时,例如你做在我研究游戏排行榜中,当让人自由输入姓名时,人们可以输入一些符号,例如∶"<"、">"、"/"、"?"等,当生成XML时,会破坏了XML结构,使数据中断。

这就要用XML CDATA

在XML文档中的所有文本都会被解析器解析。

只有在CDATA部件之内的文本会被解析器忽略。


--------------------------------------------------------------------------------

解析数据
XML 解析器通常情况下会处理XML文档中的所有文本。

当XML元素被解析的时候,XML元素内部的文本也会被解析:

<message>This text is also parsed</message>

XML解析器这样做的原因是XML元素内部可能还包含了别的元素,象下面的例子,name元素内部包含了first和last两个元素:

<name><first>Bill</first><last>Gates</last></name>

解析器会认为上面的代码是这样的:

<name>
<first>Bill</first>
<last>Gates</last>
</name>


--------------------------------------------------------------------------------

转义字符
不合法的XML字符必须被替换为相应的实体。

如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该象下面那样书写代码:

<message>if salary < 1000 then</message>

为了避免出现这种情况,必须将字符"<" 转换成实体,象下面这样:

<message>if salary &lt; 1000 then</message>

下面是五个在XML文档中预定义好的实体:

&lt; < 小于号
&gt; > 大于号
&amp; & 和
&apos; ' 单引号
&quot; " 双引号

实体必须以符号"&"开头,以符号";"结尾。
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。


--------------------------------------------------------------------------------

CDATA部件
在CDATA内部的所有内容都会被解析器忽略。

如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。

一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
</script>

在前面的例子中,所有在CDATA部件之间的文本都会被解析器忽略。

CDATA注意事项:
CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,将很有可能出错哦。

同样要注意在字符串"]]>"之间没有空格或者换行符。



sendRedirect,forward,include区别

首先,sendRedirect与forward,include的最大区别是request,response..
sendRedirect产生新的请求与响应,前后已没有联系.
相当于在页面中重新输入一个URL,只是自动完成而已.
forward,include是共用同一请求.客户端完全不知道(浏览器中的URL不变)

使用方式:
servlet和jsp里面一样

Java代码

   1. response.sendRedirect();  

response.sendRedirect();




其次,forward与include的区别.
调用forward()方法时必须注意下列两点:
在HTTP回应被“确认”(committed)以前才能调用forward()方法(这里的“确认”是指将HTTP回应的内容主体送回用户端),否则将拋出IllegalStateException异常。[include没有这种情况]
调用forward()方法后,原先存放在HttpResponse对象中的内容将会自动被清除(也就是在forward方法前,使用PrintWriter,ServletOutputStream输出的内容都被忽略)
[include不会]

使用方式
Servlet中
Java代码

   1. getServletContext().getRequestDispatcher(path).include(request,response); 
   2. getServletContext().getRequestDispatcher(path).forward(request,response); 

getServletContext().getRequestDispatcher(path).include(request,response);
getServletContext().getRequestDispatcher(path).forward(request,response);


这里面的path必须以"/",相对于当前WEB应用程序根目录
Java代码

   1. request.getRequestDispatcher(path).include(request,response); 
   2. request.getRequestDispatcher(path).forward(request,response); 

request.getRequestDispatcher(path).include(request,response);
request.getRequestDispatcher(path).forward(request,response);


这里面的path可以是以"/"开头,也可以使用相对路径.

在JSP中
Java代码

   1. <jsp:include page=""/> 
   2. <jsp:forward page=""/> 

<jsp:include page=""/>
<jsp:forward page=""/>



forward在SERVLET与JSP中表现不一致:servlet中:运行forward方法,后面的语句会执行完,再去执行forward方法 (符合JAVA程序运行顺序)
在jsp中,运行到forward后,直接跳转,后面的语句不再执行.


两者的区别:
forward方法是把请求的内容转发到另外的一个servlet/jsp.
include是把另一个servlet/jsp处理过后的内容拿过来与此时servlet的内容一同输出.

----------------------------------------------------------
forward与include还有一个重要的区别:
forward在调用者程序中设置的响应状态码和响应头不会被忽略,在被调用者程序中设置的响应状态码和响应头也不会被忽略.
include会被忽略..
这也是乱码的一个原因..
使用include时候,要要调用程序中写上response.setContentType("text/html;charset=utf-8")
不管你是不是用filter统一处理过字符.

===================================================================
总结下:
sendRedirect与include,forward的区别在于是不是同一个request
include与forward的区别在于输出内容,以及响应头!

JavaScript用encodeURIComponentt编码后无法再后台解码的问题。

原来他是这样写的:

window.self.location="searchbytext.action?searchtext="+encodeURIComponent(seartext);

java处理的代码为:

searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");/*需要处理异常*/

咋一看觉的没问题啊,一编一解的,应该可以了。但还是出现了乱码。

后来网搜资料,发现原来在对后台java程序里的searchtext赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。所以我们可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,然后在使用 searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");/*需要处理异常*/进行一次解码就好了。

正确的代码:

JavaScript:

window.self.location="searchbytext.action?searchtext="+encodeURIComponent(encodeURIComponent(seartext));

java:

searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");/*需要处理异常*/

另外还有一种方法是JavaScript进行一次编码,后台java处理时换种想法就好了:

java代码:

String s = new String(request.getParameter("name").getBytes("ISO8859-1"), "UTF-8");

java:

searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");/*需要处理异常*/

另外还有一种方法是JavaScript进行一次编码,后台java处理时换种想法就好了:

java代码:

String s = new String(request.getParameter("name").getBytes("ISO8859-1"), "UTF-8");
分享到:
评论
1 楼 sevenzeroLee 2013-12-04  
讲的很详细,学习了

相关推荐

    js编码的学习

    js编码的学习 js编码的学习 js编码的学习 js编码的学习 js编码的学习 js编码的学习

    JS邮政编码验证

    JS 邮政编码验证是指通过 JavaScript 语言来验证邮政编码的正确性,确保用户输入的邮编符合一定的格式和规则。本文将详细介绍 JS 邮政编码验证的实现方法和相关知识点。 一、邮政编码的格式和规则 邮政编码是指...

    JavaScript程序编码规范.pdf

    - **文件命名**:JavaScript文件应当使用`.js`作为扩展名。 - **HTML嵌入**:不建议将JavaScript代码直接嵌入到HTML文件中,除非这部分代码仅在此处使用。这样做的好处是可以减小HTML文件的体积,同时还可以优化...

    js技巧 javaScript编码技巧

    本文将深入探讨一些JS编码技巧,帮助开发者提升网站特效的实现能力。 一、变量与数据类型 在JavaScript中,变量声明通常使用`var`、`let`或`const`关键字。理解其作用域和生命周期至关重要。`var`具有函数作用域,...

    JavaScript编码规范_V1.00.doc

    JavaScript 编码规范 JavaScript 编码规范是软件开发过程中非常重要的一部分,它对代码的质量和可维护性产生着直接的影响。下面是对 JavaScript 编码规范的详细解释和分析。 缩进 在 JavaScript 编码中,缩进是...

    JS实现URL编码转换中文

    ### JS实现URL编码转换中文 在Web开发过程中,经常需要处理URL中的特殊字符,特别是中文字符。由于URL传输限制及浏览器解析原因,中文等非ASCII字符需要被编码为特定格式才能在网络上传输。本文将详细介绍如何使用...

    Node.js-iconv-lite-纯javascript转换字符编码

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。在处理文本时,尤其是涉及不同编码格式的数据,Node.js 提供了丰富的...

    javascript 判断是否GBK编码

    在JavaScript中,判断一个字符串是否属于GBK编码是一个常见的需求,特别是在处理中文字符集时。GBK是GB2312的扩展,包含了更多的汉字和其他字符,是Windows系统中广泛使用的中文编码标准。本篇将深入探讨如何通过...

    js对中文字符串进行gb2312编码解码

    在JavaScript(JS)中,处理中文字符编码是一个常见的需求,特别是在与服务器交互或者处理文本数据时。GB2312编码是一种在中国大陆广泛使用的简体中文字符集,它包含了6763个常用汉字和一些其他字符。在JavaScript中...

    base62.js, node.js的javascript Base62编码/解码器.zip

    base62.js, node.js的javascript Base62编码/解码器 Base62.js JavaScript Base62编码/解码器什么是Base62编码?Base62编码将数字转换为ASCII字符串( 0 -9,一个z 和一个z ),反之亦然,这通常会导致比较短的字符串...

    js实现GBK编码,避免默认utf-8编码

    前端页面通过ajax发送请求,参数都是默认使用utf-8编码格式对参数进行url编码,这样的后果就是,当后台页面如果使用gbk编码的话,会出现乱码的情况,然后网上找到一个大神写的gbk.js. 但是里面没有做出详细介绍,这里...

    js gb2312编码

    在JavaScript(js)编程语言中,GB2312编码是一种早期的中文字符编码标准,主要应用于简体中文环境。GB2312编码表包含了6763个常用汉字和一些其他符号,为中文信息处理提供了基础。然而,在网络传输和处理中,由于GB...

    javascript 编码手册

    javascript 编码手册 前端规范

    js实现GBK编码,解决乱码

    在JavaScript(JS)环境中,GBK编码是一种常见的汉字编码标准,特别是在一些旧的或者不支持Unicode的系统中。GBK编码是GB2312编码的扩展,包含更多的汉字和符号,但与Unicode不兼容,因此在处理GBK编码时需要特别...

    JavaScript程序编码规范.doc

    ### JavaScript程序编码规范详解 #### 一、引言 在软件开发领域,代码的质量直接影响着项目的长期维护性和可扩展性。良好的编码规范不仅能够提升代码的可读性,还能够帮助团队成员更快地理解和协作。《JavaScript...

    JavaScript编码规范

    JavaScript一直有着广泛的应用,特别是在浏览器端的行为管理。本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护。 虽然本文档是针对JavaScript设计的,但是在使用各种JavaScript的预编译语言时(如...

    java和js相互base64编码解码

    在Java和JavaScript中,Base64编码和解码是两个重要的功能,用于处理这种编码格式。下面将详细阐述这两个编程语言中实现Base64编码和解码的方法。 首先,让我们关注Java。在Java 8及更高版本中,已经内置了`java....

    Javascript编码规范

    ### JavaScript编码规范详解 #### 一、引言 随着Web技术的发展,JavaScript作为一种重要的前端脚本语言,在网页交互设计和动态效果实现上扮演着至关重要的角色。然而,由于JavaScript语言本身的特性,例如语法较为...

    JavaScript 程序编码规范(pdf).rar

    这篇PDF文档《JavaScript程序编码规范》详细介绍了编写JavaScript代码时应遵循的一系列规则和最佳实践。 首先,编码规范通常包括命名约定。在JavaScript中,变量、函数和对象的命名应该清晰、简洁且具有描述性。...

    js实现GBK编码

    JavaScript(简称JS)是一种广泛应用于Web开发的轻量级脚本语言,主要用于客户端的网页交互。在处理中文字符集时,我们经常会遇到编码问题,尤其是当服务器与客户端使用不同的字符编码标准时,如GBK(国标扩展编码)...

Global site tag (gtag.js) - Google Analytics