我正在解析一个二进制文件以提取文本内容。这是一个可以在 Node 环境或 Web 浏览器中运行的库。我需要将所有字符转换为人类可读的编码版本。所以我收到一个示例字符串,例如
'Señor and salvación and Number%3A 1234%3B %06%88'
我希望输出是
'Señor and salvación and Number: 1234; ♠'
目前我正在使用解码和转义字符串的混合,使用我在另一个 SO 问题上找到的函数。我完全同意扔掉它,转而选择其他效果更好的东西。我知道我所做的根本不理想,但我不确定我需要做什么才能使这项工作正常进行。下面的示例显示了该函数以及获得最终输出的步骤,该输出接近但并不完美。
另一个问题是,使用decodeURIComponent
有时会抛出URIError: URI malformed
错误,具体取决于我给它的输入类型
function escapeString(str) {
//A replacement for the deprecated escape method
//https://stackoverflow.com/a/37303214/79677
const allowed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./,';
str = str.toString();
const len = str.length;
let R = '';
let k = 0;
let S = '';
let chr = '';
let ord = 0;
while (k < len) {
chr = str[k];
if (allowed.indexOf(chr) !== -1) {
S = chr;
} else {
ord = str.charCodeAt(k);
if (ord < 256) {
S = '%' + ('00' + ord.toString(16)).toUpperCase().slice(-2);
} else {
S = '%u' + ('0000' + ord.toString(16)).toUpperCase().slice(-4);
}
}
R += S;
k++;
}
return R;
}
const str = 'Señor and salvación and Number%3A 1234%3B %06%88';
//Expecting: 'Señor and salvación and Number: 1234; ♠'
console.log(1, str);
console.log(2, escapeString(str))
console.log(3, decodeURIComponent(escapeString(str)));
console.log(4, unescape(decodeURIComponent(escapeString(str))));
如何正确、正确且一致地将字符串解码/转换为人类可读的版本?
您面临一个(混合的)mojibake案例(Python 中的示例,因为它具有普遍的可理解性):
重写为 JavaScript(抱歉代码蹩脚且愚蠢):
请注意,字符串中的两个尾随字符(编码为 的百分比
%06%88
)是不可打印的代码