2014-12-23 147 views
1

我想使用nodejs将char'十'(\ u5341)编码为big5'%A4Q',但我不知道该怎么做。我需要帮助。如何在node.js中获取big5 urlencode?

更多细节,波纹管是一个html文件名的test.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=big5"> 
    <title>test</title> 
</head> 
<body> 
    <form> 
     <input name="a"/> 
     <input type="submit"> 
    </form> 
</body> 
</html> 

而在Chrome中打开此文件,键入“十”,然后点击“提交”,就可以看到URL地址栏是'http://localhost/test.html?a=%A4Q'。

我只想使用nodejs来转换与Chrome(和其他浏览器)相同的url。我试图用的iconv - 精简版或节点的iconv,但不能将“十”到“%A4Q”


使用的iconv - 精简版和节点的iconv我得到不同的结果。代码是:

var iconv = require('iconv-lite'); 
var Iconv = require('iconv').Iconv; 
var iconv2 = new Iconv('utf8', 'BIG5'); 

function format(buf) { 
    var rtn = ""; 
    for(var i=0;i<buf.length;i++) { 
     rtn += "%" + buf[i].toString(16); 
    } 
    return rtn; 
} 

var chr = '十'; 
console.log(format(iconv.encode(chr, 'big5'))); 
console.log(format(iconv2.convert(chr))); 

结果是:

%a2%cc 
%a4%51 

即使我用Java:System.out.println(URLEncoder.encode("十", "Big5"));我还得到 '%A4%51'。

这里有一个相关的问题:URL Decode Difference between C# and Java

回答

0

,因为51%是中文字符 'Q',所以 '%A4Q' 等于 '%A4%51',将进行urlencode解析它。

更重要的是,在 '%A4Q' 的 'A' 是不区分大小写的,而 'Q' 不是,因为 'Q' 和 'q' 是不同模式(%51%71)

1

根据上面的@ user1783292的回答,我编写了下面的代码。

var Iconv = require('iconv').Iconv; 
var iconv = new Iconv('utf8', 'BIG5'); 

function big5_encode(chr) { 
    var rtn = ""; 
    var buf = iconv.convert(chr); 
    for(var i=0;i<buf.length;i+=2) { 
     rtn += '%' + buf[i].toString(16).toUpperCase(); 
     rtn += ((buf[i+1] >= 65 && buf[i+1] <= 90) 
      ||(buf[i+1]>=97 && buf[i+1]<=122)) 
      ? String.fromCharCode(buf[i+1]) 
      : '%' + buf[i+1].toString(16).toUpperCase(); 
    } 
    return rtn; 
} 

var chr = '十尢我'; 
console.log(big5_encode(chr)); 

输出为%A4Q%A4q%A7%DA,与Chrome相同。

也许有关于big5 url编码的一些标准规则,但我没有找到它。 Java的URLDecoder也可能会忽略这些规则(所以它不正确)。

+0

更重要的是,节点的iconv比的iconv-精简版更精确。我不知道iconv-lite是否存在bug,它在对诸如“十”之类的字符进行编码时,与node-iconv和Chrome等浏览器不同。 – abeyuhang

+0

ehhh,char'里',node-iconv不能转换它(会抛出异常)。但iconv-lite可以正确编码它。 – abeyuhang

1

我相信有人可能需要解码function.lol

function big5_urldecode(str){ 
    var tokens = str.split("%").slice(1); 
    var chars = []; 
    tokens.forEach((token)=>{ 
    chars.push(parseInt(token.substring(0,2),16)); 
    if(token.length > 2){ 
     chars.push(token.charCodeAt(2)); 
    } 
    }); 
    return chars; 
}