zoukankan      html  css  js  c++  java
  • 【转载】用JavaScript实现PHP的urlencode函数

    需要用到PHP的urlencode函数,于是Google之,发现有几种说法。

    有的说用JavaScript自带的encodeURIComponent函数即可实现,真是睁着眼睛说瞎话。不解释,自己测试一下就知道JavaScript的encodeURIComponent的PHP的urlencode是不一样的。有的给出了由VBScript和JavaScript混合编写的urlencode,对不对我没有测试,即使对,也只有IE兼容VBScript。还有的贴出一段不知道是自己写的还是哪里转来的代码,都不测试一下对不对就公布出来。

    根据我的经验,中文一般是搜不出什么好代码的,用英文的Google搜索,找到三个不同的版本实现,phpjs.orgwebtoolkit.infocass-hacks.com。第一个给出的函数可以直接使用,第二个给出的Url变量也可以直接使用,第三个给出的函数也是对的,但是要保证输入的参数是UTF-8编码。传说JavaScript的内部采用的是UTF-16编码(是不是我也不知道,传说而已),所以要使用第三个函数需要先把字符串转成UTF-8。幸好这个牛人提供了这样一个函数,把两个结合起来就完成了JavaScript版的urlencode函数。

    注:不同编码下中文的urlencode是不同的,例如“恶魔”在UTF-8编码下urlencode后为%E6%81%B6%E9%AD%94,而在gb2312编码下urlencode后为%B6%F1%C4%A7。鉴于UTF-8比较普遍,本代码仅实现了UTF-8编码的PHP urlencode函数。

    下面是代码:

    function urlencode(clearString) 
    {
    	var output = '';
    	var x = 0;
    	
    	clearString = utf16to8(clearString.toString());
    	var regex = /(^[a-zA-Z0-9-_.]*)/;
    
    	while (x < clearString.length) 
    	{
    		var match = regex.exec(clearString.substr(x));
    		if (match != null && match.length > 1 && match[1] != '') 
    		{
    			output += match[1];
    			x += match[1].length;
    		} 
    		else 
    		{
    			if (clearString[x] == ' ')
    				output += '+';
    			else 
    			{
    				var charCode = clearString.charCodeAt(x);
    				var hexVal = charCode.toString(16);
    				output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
    			}
    			x++;
    		}
    	}
    
    	function utf16to8(str) 
    	{
    		var out, i, len, c;
    
    		out = "";
    		len = str.length;
    		for(i = 0; i < len; i++) 
    		{
    			c = str.charCodeAt(i);
    			if ((c >= 0x0001) && (c <= 0x007F)) 
    			{
    				out += str.charAt(i);
    			} 
    			else if (c > 0x07FF) 
    			{
    				out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
    				out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
    				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
    			} 
    			else 
    			{
    				out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
    				out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
    			}
    		}
    		return out;
    	}
    
    	return output;
    }
  • 相关阅读:
    SD卡镜像系列文件(uImage、zImage、dtb、rbf、uboot、preloader)如何更新到SD卡
    printk()打印的信息没办法在终端显示,那怎么调试驱动呢?
    【动态规划】ybt1301 大盗阿福
    【广度优先搜索】ybt1250 The Castle
    【数论/递归】P1017 进制转换
    【深度优先搜索/字符串】P1019 单词接龙
    4-18整理
    【数据结构】用结构体实现并查集
    【数据结构】图论基础整理
    【数据结构】二叉树基本内容整理(一)
  • 原文地址:https://www.cnblogs.com/lans/p/2442317.html
Copyright © 2011-2022 走看看