java 在JS中的编码问题

在当前的web应用中,js操作页面元素的情况越来越多,尤其是通过js发起异步请求时遇到编码问题的情况经常出现。下面介绍在js中出现编码问题的几种情况。

1.外部引入js文件

在一个单独的js文件中包含字符串输入的情况,如:

      <html>
     <head>
     <script src="statics/javascript/script.js" charset="gbk"></script>

如果引入一个script.js脚本,这个脚本中有如下代码:

     document.write("这是一段中文");
     //document.getElementById('testid').innerHTML = '这是一段中文‘;

这时如果script没有设置charset,浏览器就会以当前和这个页面的默认字符集解析这个js文件,如果外部的js文件的编码格式与当前页面的编码格式一致,那么可以不设置这个charset。但是,如果script.js文件与当前页面的编码格式不一致,如script.js是UTF-8编码而页面又是GBK编码,上面代码中的中文输入就会变成乱码。

2.JS的URL编码

通过js发起异步调用的url默认编码也是受浏览器影响的,如使用原始ajax的http_request.open(‘GET‘,url,true)调用,URL的编码在IE下是操作系统的默认编码,而在FireFox下则是UTF-8编码。另外,不同的JS框架可能对URl编码处理也不一样。那么,如何处理JS的URL编码问题呢?

实际上,在JS中处理URL编码的函数有三个,只要掌握了这三个函数,基本上就能正确处理JS的URL乱码问题了。

1.escape()

这个函数是将ASCII字母、数字,标点符号(* + - . / @ _)之外的其他自负转化成Unicode编码值,并且在编码值前加上“%u“,如下图所示。

通过将特殊字符转换成Unicode编码值,可以避免因为编码的字符集不兼容而出现信息丢失问题,在服务端通过解码参数就可以避免乱码问题。

注意,escape()和unecape()已经从ECMAScript v3标准中删除了,URL的编码可以用encodeURI()和encodeURIComponent来代替。

2.encodeURI()

与escape()相比,encodeURI()是真正的JS用来对URL编码的函数,它可以将整个URL中的字符(一些特殊字符除外,如“!” "#" "$" "&" "‘" "(" ")" "*" "+" "," "-" "." "/" ":" ";" "=" "?" "@" "_" "~" "0-9" "a-z" "A-Z")进行UTF-8编码,在每个码值前加上“%”,如下图所示。

解码通过decodeURI函数,如下图所示。

3.encodeURICompoent()

encodeURIComponent()这个函数比encodeURI()编码还要彻底,它除了对"!" "," "(" ")" "*" "-" "." "_" "~" "0-9" "a-z" "A-Z" 这几个字符不编码,对其他所有字符都编码。这个函数通常用于将一个URL当作一个参数放在另一个URL中,如下图所示。

它可以将HTTP://localhost/servlet/君山?a=c&a=b 作为一个参数放在另一个URL中,如果不进行encodeURIComponent()编码,后面URL中的“&”将会影响前面的URL的完整性。通过decodeURIComponent()进行编码,如下图所示。

4.java与js遍解码问题

前面所说的三个函数都是JS来处理的,如果JS进行了编码,编码的字符传到服务端后可以Java来解码,那么Java又是怎么解码的呢?

我们知道,在Java端处理URL编解码有两个类,分别是java.net.URLEncoder和java.net.URLDecoder。这两个类可以将所有"%"加UTF-8码值用UTF-8解码,从而得到原始的字符。查看URLEncoder的源码你可以发现,URLEncoder受保护的特殊字符要少于在JS中受保护的特殊字符。Java端的URLEncoder和URLDecoder与前端JS对应的是encodeURIComponent和decoderURIComponent。注意,前端用encodeURIComponent编码后,到服务端用URLDecoder解码可能会出现乱码,这一定是两个字符编码不一致导致的。JS编码默认的是UTF-8编码,而服务端中文解码一般都是GBK或者GB2312,所以用encodeURIComponent编码后是UTF-8,而Java用GBK去解码显然不对。解决的办法是用encodeURIComponent两次编码,如encodeURIComponent(encodeURIComponent(str))。这样在Java端通过request.getParamter()用GBK解码后取得的就是UTF-8编码的字符串,如果Java端需要使用这个字符串,则再用UTF-8解码一次;如果是将这个结果直接通过JS输出到前端,那么这个UTF-8字符串可以直接在前端正常显示。

时间: 2024-12-25 10:50:31

java 在JS中的编码问题的相关文章

JS中URL编码参数(UrlEncode)

网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的形式传过去 , 所以别直接就那样赋值以下是对变量值的URL编码总结 : 意见用encodeURIComponent() , GET 和POST方法都能够发送过去Java编程script中存在几种对URL字符串停止编码的窍门:escape(),encodeURI(),以及encodeURIComponent().这几种编码所起的功能各不相同.e

判断java或js中的某个字符串中是否包含有某个字符或是字符串

js中: varCts = "aaddssyes"; if(Cts.indexOf("yes") > 0 ){     alert('Cts中包含Text字符串'); } 找的是最开始的位置,如果没找到,则返回的是-1. functionIndexDemo(str){    varstr1 = "BABEBIBOBUBABEBIBOBU"    vars = str1.indexOf(str);    return(s); } str是外边

java和js中不定项参数调用方法

一.java中 public void test(Object ... args){ for(Object temp:args){ System.out.print(temp); } } 二.js中 用arguments对象 function test(){ for(var i=0;i<=arguments.length;i++){ alert(""+arguments[i]); } }

java、js中实现无限层级的树形结构(类似递归)

js中: var zNodes=[{id:0,pId:-1,name:"Aaaa"},    {id:1,pId:0,name:"A"},    {id:11,pId:1,name:"A1"},    {id:12,pId:1,name:"A2"},    {id:13,pId:1,name:"A3"},    {id:2,pId:0,name:"B"},    {id:21,pId:2

JS中的编码,解码类型及说明

可以使用encodeURIComponent在前台进行编码,C#后台使用Server.UrlDecode(paras)解码来解决此问题 前台js: $.ajax({ url: "", type: "POST", data: { "paras": encodeURIComponent(JSON.stringify(paras))}, success: function (data) { } }); C#后台: string str= Server.

Java - 将vCard中十六进制编码转换成Unicode

做课程设计的时候在处理vCard格式的时候遇到过出现十六进制编码的情况,例如 QUOTED-PRINTABLE:=XX=XX=XX=XX=XX`````` 其中XX代表十六进制数,当然,也有可能在末尾跟着非十六进制的字符串(一般是数字).每一个十六进制数的前面都有一个"=",那么我们需要怎样处理它才能得到我们需要的字符串呢? 先看代码: 1 package Function.Base_Function; 2 3 import java.io.UnsupportedEncodingExc

java、js的编码、解码

如果在地址栏挂载参数,特别是包含中文,往往要进行编码,取值时再解码,以下是java和js中编码.解码的各自方法. java: @Test public void test3() throws UnsupportedEncodingException{ System.out.println(URLEncoder.encode("我", "UTF-8"));//%E6%88%91 System.out.println(URLDecoder.decode("%E

Android与H5交互(java与js的交互)

1.Android  java代码 //java代码 package com.wytiger.jsdemo; import android.app.Activity;import android.os.Bundle;import android.content.Context;import android.graphics.Color;import android.view.View;import android.webkit.JavascriptInterface;import android

Java web应用中的常见字符编码问题的解决方法

以下是 Java Web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Content-Type: text/html; charset=UTF-8, 页面使用的就UTF-8编码. 但是考虑到离线的html(用户可能把页面html保存到本地), 打开离线的html的时候就要在meta指定编码,当然不指定也会有default值,那么不指定有时就可能出现乱码. Meta标签 <