我想用nodejs将char '十'(\u5341) 编码成big5 '%A4Q',但我不知道该怎么做。我需要帮助。
更详细的,下面是一个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-lite 或 node-iconv,但无法将“十”转换为“%A4Q”
使用 iconv-lite 和 node-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'。
最佳答案
根据@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 encode 的标准规则,但我没有找到。而 Java 的 URLDecoder 也可能会忽略这样的规则(所以这是不正确的)。
关于javascript - 如何在 node.js 中获取 big5 urlencode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27621643/