JavaScript中如何将含编码字符的字符串转为可读形式?
JavaScript 转义UTF-8编码字符串为可读文本的实现方案
针对API返回的带\xXX格式UTF-8字节转义的字符串(如Universit\xc3\xa0 di Parma),可以通过以下两种常见方法转换为可读文本:
方法一:利用decodeURIComponent快速转换
这种方法通过将\xXX替换为URI编码的%XX格式,再用decodeURIComponent解码,实现简单高效:
function decodeUtf8Escape(str) { // 将\xXX格式替换为%XX,再解码UTF-8 return decodeURIComponent(str.replace(/\\x([0-9A-Fa-f]{2})/g, '%$1')); } // 示例使用 const encodedStr = "Universit\\xc3\\xa0 di Parma"; const decodedStr = decodeUtf8Escape(encodedStr); console.log(decodedStr); // 输出:Università di Parma
注意:如果输入字符串在代码中是直接写的单转义(如"Universit\xc3\xa0 di Parma"),JS引擎会自动将其解析为对应的字符,此时不需要额外处理;但如果是API返回的字符串包含字面量的\x(即代码中表现为双反斜杠\\x),则需要用上述方法处理。
方法二:使用TextDecoder处理复杂场景
对于包含普通文本和转义字节混合的复杂字符串,推荐使用现代的TextDecoderAPI,它能更精准地处理UTF-8字节序列:
function decodeUtf8Escape(str) { // 拆分字符串为普通文本和转义片段 const parts = str.split(/(\\x[0-9A-Fa-f]{2})/); const byteArray = []; const encoder = new TextEncoder(); for (const part of parts) { if (part.startsWith('\\x')) { // 将\xXX转换为十进制字节 byteArray.push(parseInt(part.slice(2), 16)); } else { // 将普通文本转换为UTF-8字节 byteArray.push(...encoder.encode(part)); } } // 解码字节数组为UTF-8文本 const decoder = new TextDecoder('utf-8'); return decoder.decode(new Uint8Array(byteArray)); } // 示例使用 const encodedStr = "Universit\\xc3\\xa0 di Parma"; console.log(decodeUtf8Escape(encodedStr)); // 输出:Università di Parma
这种方法能同时处理普通文本和转义字节的混合内容,兼容性好(支持ES2017及以上环境)。
内容的提问来源于stack exchange,提问作者Damiano
相关产品推荐
相关产品推荐

