Node.js 汉字的URLDecode

Node.js 汉字的URLDecode

找了好多资料,没发现如何通过Node.js来Decode汉字,比如这个字符单,通过常见的网页URLDecode工具就能编译成汉字,有朋友知道 Node.js里如何做到吗?多谢!

7 回复

Node.js 汉字的URLDecode

在Node.js中处理URL编码(包括对汉字进行解码)是一个常见的需求。通常情况下,URL编码会将特殊字符转换为百分号(%)后跟两位十六进制数的形式。然而,在某些场景下,你可能会遇到类似单这样的Unicode字符,这种形式需要先转换为UTF-8编码再进行解码。

示例代码

我们可以使用Node.js内置的decodeURIComponent函数来处理标准的URL编码。但针对像单这样的Unicode字符,我们需要额外的步骤将其转换为对应的UTF-8字符串。

function decodeUnicode(str) {
    return str.replace(/&#x([0-9A-Fa-f]+);/g, function(match, p1) {
        return String.fromCharCode(parseInt(p1, 16));
    });
}

// 示例
const encodedString = "这是测试字符串单";
const decodedString = decodeURIComponent(encodedString.replace(/&#x([0-9A-Fa-f]+);/g, '%u$1'));
console.log(decodedString);

在这个例子中,我们首先定义了一个decodeUnicode函数,它接受一个字符串并替换所有形如&#x...;的Unicode字符,将其转换为对应的UTF-8字符。

然后,我们使用decodeURIComponent函数对剩余的URL编码部分进行解码。为了兼容decodeURIComponent,我们将Unicode字符转换为%u加上十六进制值的形式。

解释

  1. 正则表达式/&#x([0-9A-Fa-f]+);/g匹配所有以&#x开头,以;结尾,并且中间包含十六进制数字的模式。
  2. 替换函数String.fromCharCode(parseInt(p1, 16))将匹配到的十六进制数字转换为对应的UTF-8字符。
  3. 解码decodeURIComponent用于解码标准的URL编码。

这种方法可以有效地处理包含Unicode字符的URL编码字符串。希望这对你有所帮助!


单是字符实体引用,在nodejs中把它当成一个字来考虑就行,不需要解码,输出到html它自己能显示。 如果一定要把它解码成汉字,可以用String.fromCharCode()方法。 注意x5355是16进制表示法,需要先转换成10进制再用String.fromCharCode()

我写过一个包。

true-html-escaper

可直接 npm install

感谢大家!

你肯定永cheerio了吧 cheerio 解析的时候传入个配置也可以 heerio.load(body, { decodeEntities: false });

在Node.js中,处理URL编码(包括包含汉字的URL编码)可以使用内置的querystring模块或者decodeURIComponent函数。对于你提到的单这种形式的编码,实际上并不是标准的URL编码格式,而是一种HTML实体编码。我们可以先将其转换为实际的UTF-8字符。

以下是一个简单的示例代码,演示如何将HTML实体编码的汉字解码为实际的UTF-8字符:

function decodeHtmlEntity(entity) {
    return entity.replace(/&#x([0-9a-fA-F]+);/g, function(match, p1) {
        return String.fromCharCode(parseInt(p1, 16));
    });
}

const encodedText = '单';
const decodedText = decodeHtmlEntity(encodedText);
console.log(decodedText); // 输出: 单

在这个例子中,我们定义了一个decodeHtmlEntity函数,它接受一个包含HTML实体编码的字符串,并使用正则表达式来匹配这些编码。对于每个匹配到的HTML实体编码,我们使用String.fromCharCode函数将其转换为对应的UTF-8字符。

如果你需要处理的是标准的URL编码(如%E5%8D%95),你可以直接使用decodeURIComponent函数:

const urlEncodedText = '%E5%8D%95';
const decodedText = decodeURIComponent(urlEncodedText);
console.log(decodedText); // 输出: 单

以上代码展示了如何在Node.js中处理不同的编码方式。希望这能解决你的问题!

回到顶部