Javascript 十六进制到带拉丁扩展符号的 ASCII

Javascript hexadecimal to ASCII with latin extended symbols

我得到的字符串的十六进制值如下所示:

String has letters with diacritics: č,š,ř, ...

此字符串的十六进制值为:

0053007400720069006E006700200068006100730020006C0065007400740065007200730020007700690074006800200064006900610063007200690074006900630073003A0020010D002C00200161002C00200159002C0020002E002E002E

问题是,当我尝试将此值转换回 ascii 时,它无法很好地转换 č、š、ř、.. 和 returns 带问号的小方框符号,而不是这些符号.

我将十六进制转换为 ascii 的代码:

function convertHexadecimal(hexx){

  let index = hexx.indexOf("~");
  let strInfo = hexx.substring(0, index+1);
  let strMessage = hexx.substring(index+1); 
  var hex  = strMessage.toString();
  var str = '';     
  for (var i = 0; i < hex.length; i += 2){     
      str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));     
  }
  console.log("Zpráva: " + str);
  var strFinal = strInfo + str;
  return strFinal; 
}

有人可以帮我解决这个问题吗?

首先是一个示例解决方案:

let demoHex = `0053007400720069006E006700200068006100730020006C0065007400740065007200730020007700690074006800200064006900610063007200690074006900630073003A0020010D002C00200161002C00200159002C0020002E002E002E`;

function hexToString(hex) {
    let str="";
    for( var i = 0; i < hex.length; i +=4) {
       str += String.fromCharCode( Number("0x" + hex.substr(i,4)));
    }
    return str;
}
console.log("Decoded string: %s", hexToString(demoHex) );

它在做什么:

它将十六进制字符视为提供字符的 UTF-16 字符代码的 4 个十六进制数字的序列。

  • 它使用String.prototype.substr循环获取每组4位数字。注意 MDN 说 .substr 已被弃用,但这在 ECMASript 标准中没有提到 - 重写它以使用 substring 或您希望的其他内容。

  • 十六进制字符以“0x”为前缀,使它们成为 JavaScript 中的有效数字表示,并使用 Number 转换为数字对象。然后使用 String.fromCharCode 静态方法将数字转换为字符串。

我通过查看猜测了十六进制字符串的格式,这意味着将 UTF16 字符(不是代码点)编码为十六进制的通用编码例程可能如下所示:

const hexEncodeUTF16 =
   str=>str.split('')
  .map( char => char.charCodeAt(0).toString(16).padStart(4,'0'))
  .join('');

console.log( hexEncodeUTF16( "String has letters with diacritics: č, š, ř, ..."));

我希望这些示例说明需要做什么 - 有多种方法可以在代码中实现它。