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: č, š, ř, ..."));
我希望这些示例说明需要做什么 - 有多种方法可以在代码中实现它。
我得到的字符串的十六进制值如下所示:
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: č, š, ř, ..."));
我希望这些示例说明需要做什么 - 有多种方法可以在代码中实现它。