【问题标题】:Hex to Windows-1251 with JavaScript使用 JavaScript 将十六进制转换为 Windows-1251
【发布时间】:2019-04-06 11:05:25
【问题描述】:

我正在尝试将十六进制字符串转换为使用 Windows-1251 编码的字符串。我需要使用 JavaScript。我试过使用某人发布的这个示例:

var win1251 = new TextDecoder("windows-1251");

for (var i = 0x00; i < 0xFF; i++) {
    var hex = (i <= 0x0F ? "0" : "") +  i.toString(16).toUpperCase();
    decodeMap[hex] = win1251.decode(Uint8Array.from([i]));
}

但我似乎无法让它工作。有人可以帮忙吗?

【问题讨论】:

  • “但我似乎无法让它工作”是否有错误?它是否返回错误的值?还有什么?
  • 我认为逻辑是错误的。假设我有 "3230313830363131313535303435303831" 。在 windows-1251 中,我必须能够得到这个结果“20180611155045081”

标签: javascript string hex decode windows-1251


【解决方案1】:

您可能以不正确的方式使用它。
您发布的代码创建字典(十六进制 => windows-1251)。
因此,要将十六进制字符串转换为 windows-1251 字符串,您必须:

  1. 将十六进制字符串拆分为包含 2 个十六进制元素的数组
  2. 将每个元素转换为 windows-1251
  3. 将结果数组加入字符串

var decodeMap = {};
var win1251 = new TextDecoder("windows-1251");

for (var i = 0x00; i < 0xFF; i++) {
    var hex = (i <= 0x0F ? "0" : "") +  i.toString(16).toUpperCase();
    decodeMap[hex] = win1251.decode(Uint8Array.from([i]));
}

var number = "3230313830363131313535303435303831";
var hexarr = number.toUpperCase().match(/[0-9A-F]{2}/g)
var win1251arr = hexarr.map(el=> decodeMap[el]);
console.log(win1251arr.join(""))

你也可以用更短的方式(直接翻译你的十六进制字符串而不创建字典):

var win1251 = new TextDecoder("windows-1251");
var number = "3230313830363131313535303435303831";
var arr = number.toUpperCase().match(/[0-9A-F]{2}/g).map(el=>"0x"+el);
var uarr = Uint8Array.from(arr);
console.log(win1251.decode(uarr));

如果你的浏览器不支持TextDecoder,你可以使用第一个sn-p的字典:

var decodeMap = getHexToWin1251Dictionary();

var number = "3230313830363131313535303435303831";
var hexarr = number.toUpperCase().match(/[0-9A-F]{2}/g)
var win1251arr = hexarr.map(el=> decodeMap[el]);
console.log(win1251arr.join(""))


// function below returns content of decodeMap from first snippet
function getHexToWin1251Dictionary(){
  return {"10":"\u0010","11":"\u0011","12":"\u0012","13":"\u0013","14":"\u0014","15":"\u0015","16":"\u0016","17":"\u0017","18":"\u0018","19":"\u0019","20":" ","21":"!","22":"\"","23":"#","24":"$","25":"%","26":"&","27":"'","28":"(","29":")","30":"0","31":"1","32":"2","33":"3","34":"4","35":"5","36":"6","37":"7","38":"8","39":"9","40":"@","41":"A","42":"B","43":"C","44":"D","45":"E","46":"F","47":"G","48":"H","49":"I","50":"P","51":"Q","52":"R","53":"S","54":"T","55":"U","56":"V","57":"W","58":"X","59":"Y","60":"`","61":"a","62":"b","63":"c","64":"d","65":"e","66":"f","67":"g","68":"h","69":"i","70":"p","71":"q","72":"r","73":"s","74":"t","75":"u","76":"v","77":"w","78":"x","79":"y","80":"Ђ","81":"Ѓ","82":"‚","83":"ѓ","84":"„","85":"…","86":"†","87":"‡","88":"€","89":"‰","90":"ђ","91":"‘","92":"’","93":"“","94":"”","95":"•","96":"–","97":"—","98":"","99":"™","00":"\u0000","01":"\u0001","02":"\u0002","03":"\u0003","04":"\u0004","05":"\u0005","06":"\u0006","07":"\u0007","08":"\b","09":"\t","0A":"\n","0B":"\u000b","0C":"\f","0D":"\r","0E":"\u000e","0F":"\u000f","1A":"\u001a","1B":"\u001b","1C":"\u001c","1D":"\u001d","1E":"\u001e","1F":"\u001f","2A":"*","2B":"+","2C":",","2D":"-","2E":".","2F":"/","3A":":","3B":";","3C":"<","3D":"=","3E":">","3F":"?","4A":"J","4B":"K","4C":"L","4D":"M","4E":"N","4F":"O","5A":"Z","5B":"[","5C":"\\","5D":"]","5E":"^","5F":"_","6A":"j","6B":"k","6C":"l","6D":"m","6E":"n","6F":"o","7A":"z","7B":"{","7C":"|","7D":"}","7E":"~","7F":"","8A":"Љ","8B":"‹","8C":"Њ","8D":"Ќ","8E":"Ћ","8F":"Џ","9A":"љ","9B":"›","9C":"њ","9D":"ќ","9E":"ћ","9F":"џ","A0":" ","A1":"Ў","A2":"ў","A3":"Ј","A4":"¤","A5":"Ґ","A6":"¦","A7":"§","A8":"Ё","A9":"©","AA":"Є","AB":"«","AC":"¬","AD":"­","AE":"®","AF":"Ї","B0":"°","B1":"±","B2":"І","B3":"і","B4":"ґ","B5":"µ","B6":"¶","B7":"·","B8":"ё","B9":"№","BA":"є","BB":"»","BC":"ј","BD":"Ѕ","BE":"ѕ","BF":"ї","C0":"А","C1":"Б","C2":"В","C3":"Г","C4":"Д","C5":"Е","C6":"Ж","C7":"З","C8":"И","C9":"Й","CA":"К","CB":"Л","CC":"М","CD":"Н","CE":"О","CF":"П","D0":"Р","D1":"С","D2":"Т","D3":"У","D4":"Ф","D5":"Х","D6":"Ц","D7":"Ч","D8":"Ш","D9":"Щ","DA":"Ъ","DB":"Ы","DC":"Ь","DD":"Э","DE":"Ю","DF":"Я","E0":"а","E1":"б","E2":"в","E3":"г","E4":"д","E5":"е","E6":"ж","E7":"з","E8":"и","E9":"й","EA":"к","EB":"л","EC":"м","ED":"н","EE":"о","EF":"п","F0":"р","F1":"с","F2":"т","F3":"у","F4":"ф","F5":"х","F6":"ц","F7":"ч","F8":"ш","F9":"щ","FA":"ъ","FB":"ы","FC":"ь","FD":"э","FE":"ю"};
}

【讨论】:

  • 你能解释一下地图中的“el”是什么吗(el=>"0x"+el);
  • 查看map 方法的作用。 el 包含当前元素的值,因此它将数组 ["32", "30", ...] 转换为 ["0x32", "0x30", ...]
  • 抱歉,有没有办法不使用地图方法,因为我使用的系统无法识别它?
  • 当然,你可以使用for循环
  • 如果我不使用 TextDecoder 但可能会创建一个包含所有 win-1251 字符的数组,我将如何去做。你能帮帮我吗?
猜你喜欢
  • 2015-11-11
  • 2020-05-19
  • 2022-01-14
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多