javascript 如何将十六进制编码的UTF-8字符串转换为常规字符串?

lf3rwulv  于 2023-05-16  发布在  Java
关注(0)|答案(5)|浏览(177)

我有一个字符串,它包含UTF-8字符串的十六进制编码。

"666f6f6c 6973686e 6573732c 20697420 77617320 74686520 65706f63 68206f66 2062656c 6965662c 20697420 77617320 74686520 65706f63 68206f66 20696e63 72656475 6c697479 2c206974 20776173 20746865 20736561 736f6e20 6f66204c 69676874 2c206974 20776173 20746865 2073656"

我需要把它转换回一个普通的字符串。我该怎么做?

iyfamqjs

iyfamqjs1#

var s = "666f6f6c 6973686e 6573732c 20697420 77617320 74686520 65706f63 68206f66 2062656c 6965662c 20697420 77617320 74686520 65706f63 68206f66 20696e63 72656475 6c697479 2c206974 20776173 20746865 20736561 736f6e20 6f66204c 69676874 2c206974 20776173 20746865 2073656";
var r = decodeURIComponent(s.replace(/\s+/g, '').replace(/[0-9a-f]{2}/g, '%$&'));

这个解决方案实际上处理UTF-8。
这个想法是在每对十六进制数字前面放一个%(从而创建一个URL编码字符串),然后让decodeURIComponent处理细节(特别是,它将正确解码多字节UTF-8字符)。

ljo96ir5

ljo96ir52#

要正确处理UTF8,您可能需要尝试以下方法:

function utf8ToHex(str) {
      return Array.from(str).map(c => 
        c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) : 
        encodeURIComponent(c).replace(/\%/g,'').toLowerCase()
      ).join('');
    },
    function hexToUtf8: function(hex) {
      return decodeURIComponent('%' + hex.match(/.{1,2}/g).join('%'));
    }

演示:https://jsfiddle.net/lyquix/k2tjbrvq/

mqkwyuun

mqkwyuun3#

仅节点解决方案。有一个Buffer类可以在数据之间进行转换(例如:utf字节和utf8字符串。

Buffer.from(0x66, 0x6f, 0x6f, 0x6c).toString(); // 'fool'

因此,对于空格分隔的字符串格式的字节,您将:

let s = '666f6f6c 6973686e 6573732c';

// [102, 111, 111, 108, 105, 115, 104, 110, 101, 115, 115, 44]
let bytes = [...s.matchAll(/[^ ]{1,2}/g)].map(a => parseInt(a[0], 16));

Buffer.from(bytes).toString(); // 'foolishness,'
xdnvmnnf

xdnvmnnf4#

新的TextDecoder API提供了一个解决方案。调整junvar's answer

let s = '666f6f6c 6973686e 6573732c';

// [102, 111, 111, 108, 105, 115, 104, 110, 101, 115, 115, 44]
let bytes = [...s.matchAll(/[0-9a-f]{2}/g)].map(a => parseInt(a[0], 16));

// TextDecoder defaults to UTF-8
console.log(new TextDecoder().decode(new Uint8Array(bytes)));

请注意,此解决方案适用于Node.js(v8.3.0+)和浏览器(caniuse)。

bqucvtff

bqucvtff5#

使用这个:

function HexToString(s) {
  var escaped = "";
  var hex = "";
  if(s.length%4 > 0) {
    for (i = 0; i < (4 - (s.length % 4)); i++) {
      hex += "0";
    }
  }
  hex += s;
  for (var i = 0; i < hex.length; i += 4) {
    escaped += "%u" + hex.charAt(i) + hex.charAt(i + 1) + hex.charAt(i + 2) + hex.charAt(i + 3);
  }
  return unescape(escaped).split(unescape("%00")).join("");
}

对我很有效。

相关问题