1

我想使用 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'。

这是一个相关的问题:C# 和 Java 之间的 URL 解码差异

4

3 回答 3

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 也可能会忽略这些规则(所以它是不正确的)。

于 2014-12-24T11:00:07.137 回答
1

我相信有人可能需要解码功能.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;
}
于 2017-06-15T08:23:28.110 回答
0

因为 %51 在 big5 中是 char 'Q',所以 '%A4Q' 等于 '%A4%51',urlencode 会解析它。

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

于 2014-12-23T15:16:07.933 回答