Javascript - 将字符串编码为HEX

Joh*_*nan 6 javascript hex utf-8

我有我的功能将字符串转换为十六进制:

function encode(str){
    str = encodeURIComponent(str).split('%').join('');
    return str.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

例:

????

alert(encode('????'));

输出将是:

e5ae88e68aa4e69d91e5ad90

它适用于汉字.但是当我用英文字母做的时候

alert(encode('Hello World'));

它输出:

hello20world

我试过这个将字符串转换为十六进制:

function String2Hex(tmp) {
    var str = '';
    for(var i = 0; i < tmp.length; i++) {
        str += tmp[i].charCodeAt(0).toString(16);
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)

然后尝试上面的中文字符,但它输出UTF-8 HEX:

5b8862a467515b50

不是ANSI Hex:

e5ae88e68aa4e69d91e5ad90

我也搜索过将UFT8转换为ANSI但没有运气.有人可以帮帮我吗?谢谢!

Cas*_*sio 9

const myString = "This is my string to be encoded/decoded";
const encoded = new Buffer(myString).toString('hex'); // encoded === 54686973206973206d7920737472696e6720746f20626520656e636f6465642f6465636f646564
const decoded = new Buffer(encoded, 'hex').toString(); // decoded === "This is my string to be encoded/decoded"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:我所知道的任何标准机构(包括ECMA)都没有对"缓冲"类进行标准化.然而,它是由Node.js提供的,并且做你认为它做的事情. (8认同)
  • **在浏览器中不起作用。** 它不仅不像 amn 所说的那样标准化,而且它根本不存在,不幸的是它只是 Node.js 的东西。这意味着它没有回答问题,因为显然,alert() 作为问题中使用的 OP 在 Node.js 中没有意义,它们显然意味着它可以在浏览器中工作。但希望它仍然可以帮助其他想要在服务器端代码中使用它的人...... (6认同)

Dan*_*ker 9

作为功​​能风格的独立解决方案,您可以使用以下方式进行编码:

plain.split("")
     .map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
     .join("");
Run Code Online (Sandbox Code Playgroud)

split上一个空字符串产生在每个元件中的一个字符(或更确切地说,一个UTF-16码点)的阵列。然后我们可以将每个映射到字符代码的 HEX 字符串。

然后解码:

hex.split(/(\w\w)/g)
   .filter(p => !!p)
   .map(c => String.fromCharCode(parseInt(c, 16)))
   .join("")
Run Code Online (Sandbox Code Playgroud)

这次传递给的正则表达式split捕获两个字符的组,但是这种形式的split将用空字符串散布它们(捕获组“之间”的东西,这没什么!)。Sofilter用于删除空字符串。然后map解码每个字符。

  • 这应该是公认的答案,因为它可以在现代浏览器和节点中工作,并且不需要额外的库。 (2认同)

Joh*_*nan 2

我通过下载解决了utf8.js

\n

https://github.com/mathiasbynens/utf8.js

\n

然后使用String2Hex上面的函数:

\n
alert(String2Hex(utf8.encode(\'\xe5\xae\x88\xe6\x8a\xa4\xe6\x9d\x91\xe5\xad\x90\')));\n
Run Code Online (Sandbox Code Playgroud)\n

它给了我我想要的输出:

\n

e5ae88e68aa4e69d91e5ad90

\n

  • 这个答案并不是真正独立的。它完全依赖于外部资源...... (3认同)