javascript中encodeURIComponent()函数URI中文乱码解决办法

问题描述
关于encodeURIComponent()函数应用之前在[注意javascript传递url数据的完整]一文有讨论,这里主要是讨论GBK编码的页面使用encodeURIComponent()函数编码URI通过ajax提交中文字符产生乱码的现象。

问题解决
使用encodeURIComponent()函数的目的是编码特殊字符 , / ? : @ & = + $ #,但实际应用中可能并不需要编码中文字符,因此可以编写自定义的函数替代encodeURIComponent()函数。

使 用encodeURIComponent()函数编码 , / ? : @ & = + $ # 字符 %2C %2F %3F %3A %40 %26 %3D %2B %24 %23,因此只需要使用javascript正则表达式replace()函数替换前面几个特殊字符为对应的编码即可。

只编码特殊字符的encodeURIComponent()函数替代方案

 代码如下 复制代码
function encodeURIStr(str){
    str = str.replace(/,/g, '%2C');
    str = str.replace(///g, '%2F');
    str = str.replace(/?/g, '%3F');
    str = str.replace(/:/g, '%3A');
    str = str.replace(/@/g, '%40');
    str = str.replace(/&/g, '%26');
    str = str.replace(/=/g, '%3D');
    str = str.replace(/+/g, '%2B');
    str = str.replace(/$/g, '%24');
    str = str.replace(/#/g, '%23');
    return str;
}

上面主要的函数主要是分析实现的机制,可以精简一下encodeURIStr()函数如下

 代码如下 复制代码
function encodeURIStr(str){
    var regexs = new Array(new RegExp(',', 'g'),
                      new RegExp('/', 'g'),
                      new RegExp('\?', 'g'),
                      new RegExp(':', 'g'),
                      new RegExp('@', 'g'),
                      new RegExp('&', 'g'),
                      new RegExp('=', 'g'),
                      new RegExp('\+', 'g'),
                      new RegExp('\$', 'g'),
                      new RegExp('#', 'g')
      );
    var replaces = new Array('%2C','%2F','%3F','%3A','%40','%26','%3D','%2B','%24','%23');
    for (var i = 0; i < regexs.length; i++){
        str = str.replace(regexs[i], replaces[i]);
    }
    return str;
}

实现一个自定义的encodeURIStr() 函数替代encodeURIComponent() 函数编码特殊字符。应用于与服务器进行数据交换的情况。

注意,这种替代机制具有特殊性,只有针对特殊字符(, / ? : @ & = + $ #)进行编码,实现上并不能真正替换encodeURIComponent() 函数。

参考一下replace

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

语法
stringObject.replace(regexp/substr,replacement)参数 描述
regexp/substr 必需。规定子字符串或要替换的模式的 RegExp 对象。

请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
 
replacement 必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

说明
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。

字符 替换文本
$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文本。
$' 位于匹配子串右侧的文本。
$$ 直接量符号。

注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。

时间: 2024-07-30 07:16:11

javascript中encodeURIComponent()函数URI中文乱码解决办法的相关文章

数据库 MySQL中文乱码解决办法总结

MySQL中文乱码解决办法 前言: MySQL是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 create table user(name varchar(11)); # 创建user表 insert into table user("carl"); # 添加数据 select * from user; insert into user value(&

关于cookie中文乱码解决办法

关于cookie中文乱码解决办法 后台: 存值 (使用 HttpUtility.UrlEncode 进行编码) Response.Cookies("ABC").Value = HttpUtility.UrlEncode("ABC") 取值 (使用 HttpUtility.UrlDecode 进行解码) Str = HttpUtility.UrlDecode(Request.Cookies("ABC").Value) 和JS进行交互: 在用js生成

远程linux中文乱码解决办法

使用xshell登录中文版CentOS或者redhat时,在xshell下如果输出的是中文的话可能会显示乱码,通过如下办法可以有效的解决乱码问题 linux中文乱码解决方法如下: [root@localhost ~]# cd /etc/sysconfig/ [root@localhost sysconfig]# cp i18n i18n.bak #备份i18n文件 [root@localhost sysconfig]# echo "" >i18n [root@localhost

javascript ajax提交数据中文乱码解决办法

一个UTF8页面需要POST数据到GB2312页面,这时中文的编码是按照UTF8提交过去的,GB2312页面无法接收.如何实现,网络搜索了一种很不错的方法,但有缺陷,这里一一说起. 1.FORM标签里加上accept-charset代码,这个能把FORM里的数据自动编码成指定的字符集提交,比如在UTF8页面提交数据到GB2312,代码就是accept-charset="GB2312″,但accept-charset除了IE其他浏览器都支持... 2.这时可以在提交时触发JS,document.c

jquery的ajax()函数传值中文乱码解决方法介绍_jquery

复制代码 代码如下: $.ajax({ dataType : 'json',type : 'POST',url : 'http://localhost/test/test.do',data : {id: 1, type: '商品'},success : function(data){ } } ); 问题: 提交后后台action程序时,取到的type是乱码 解决方法: 方法一:提交前采用encodeURI两次编码,记住一定是两次 1.修改以下代码 复制代码 代码如下: data:{id:1, t

Cocos2d-x框架中中文乱码解决办法

一.Cocos2d-x中中文无法显示或者显示乱码问题原因有二: 1.指定的字体是否支持,一般不指定字体使用的是系统字体,一般手机的系统字体都会支持中文,除非你使用非常个性的英文字体. 2.文件/文本编码采用utf-8编码(一般使用win txt文本编辑工具新建的文本都不是utf-8.另外sublime3.0对中文也不友好) 二.解决办法 第一点容易,指定中文字体即可 第二点使用工具将文本文件的文件编码改成utf-8即可,推荐使用Nodepad++,可以方便的实现文件编码变化,而且还不会产生乱码.

Ajax在IE浏览器会出现中文乱码解决办法

在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. Ajax在IE浏览器会出现中文乱码的情况!解决办法如下 <script type="text/javascript"> function showDiv(str){ document.getElementById("picDiv").style.display=""; var xmlhttp; if (str==""){ document.ge

Ajax的Post提交数据程序接受中文乱码解决办法

Ajax以POST方式提交,url形式为"url?param=xx&param2=xx"时,如果传递的参数是中文或日文,后台接收参数将出现乱码,疑似"灏?浼??ㄨ??rdquo;.此时我们需要将url编码成UTF-8.调用javascript方法encodeURI(URIstring),后台接收参数调用URLDecoder.decode(String s,String enc) 解码. 工作中遇到这个问题,起初打算用反射循环给属性转码,考虑到反射效率问题,为避免滥用反

PHP中文乱码解决办法[转]

一.首先是PHP网页的编码 1.     php文件本身的编码与网页的编码应匹配 a.     如果欲使用gb2312编码,那么php要输出头:header("Content-Type: text/html; charset=gb2312"),静态页面添加<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,所有文件的编码格式为ANSI,可用记事本打开