7

16進文字列(utf8文字列の内容)を含む文字列があります

"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"

それをjavascript文字列に戻す必要があります。どうやってするの ?

4

4 に答える 4

19
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を処理します。

%アイデアは、16進数のすべてのペアの前にを置き(したがって、URLエンコードされた文字列を作成し)、decodeURIComponent詳細を処理できるようにすることです(特に、マルチバイトUTF-8文字を正しくデコードします)。

于 2012-12-13T17:59:55.953 に答える
1

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/

于 2020-04-14T15:04:06.983 に答える
0

ノードのみのソリューション。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('0x' + a[0]));

Buffer.from(bytes).toString(); // 'foolishness,'
于 2021-08-05T14:20:22.637 に答える
-1

これを使って:

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("");
}

それは私のために働きます。

于 2018-04-15T14:17:40.300 に答える