解码与JavaScript的一个URL编码窗口-1251(CP1251)字符串(Decoding a

2019-09-30 12:08发布

我面临的一个问题,不幸的是,我还没有找到一个正确的解决方案:我需要解码被编码与Windows-1251(CP1251)URL片。

我知道有theese方法- decodeURI()decodeURIComponent(),但他们为UTF-8只工作(我明白)。 一个解决方案,我发现()不赞成的方法逃避用途和UNESCAPE()。

例如,有序列:

%EF%F0%EE%E3 %F0 E0%%乳油%乳油%E8%F0%EE%E2%E0%ED%E8%E5(编程)

该方法decodeURI()和decodeURIComponent()将导致异常。

将您的帮助表示感谢。

Answer 1:

有与在浏览器中遗留字符集的编码方案百分之没有内置的支持,据我可以看到。 你必须:

  1. 找到代表共赢1251八位%-escapes,
  2. 赢-1251个八位位组进行解码,以相应的字符(JS String

下面是做到这一点的方法之一。 对于#1 I假定只有3个字符的大写逃逸需要解码,并将该字符串的剩余部分已经是ASCII,所以只是使用inputStr.replace(/%([0-9A-Z]{2})/g, replacerFunction )这一点。

对于实际的解码需要从双赢的1251个字节到JS字符映射。 在下面的例子中我使用建立映射TextDecoder.decode()API ,只是为了好玩(和的情况下,有人认为这样的回答,而试图在JS不同的字符集之间进行转换)。 (注:这是没有得到普遍支持为的这段时间 - 只壁虎/闪烁支持它)。

还有https://github.com/mathiasbynens/windows-1251 ,这是我最初想使用这个答案,但它竟然是容易只是建立由专人解码图。

 var decodeMap = {}; var win1251 = new TextDecoder("windows-1251"); for (var i = 0x00; i < 0xFF; i++) { var hex = (i <= 0x0F ? "0" : "") + // zero-padded i.toString(16).toUpperCase(); decodeMap[hex] = win1251.decode(Uint8Array.from([i])); } // console.log(decodeMap); // {"10":"\u0010", ... "40":"@","41":"A","42":"B", ... "C0":"А","C1":"Б", ... // Decodes a windows-1251 encoded string, additionally // encoded as an ASCII string where each non-ASCII character of the original // windows-1251 string is encoded as %XY where XY (uppercase!) is a // hexadecimal representation of that character's code in windows-1251. function percentEncodedWin1251ToDOMString(str) { return str.replace(/%([0-9A-F]{2})/g, (match, hex) => decodeMap[hex]); } console.log(percentEncodedWin1251ToDOMString("%EF%F0%EE%E3%F0%E0%EC%EC%!%E8%F0%EE%E2%E0%ED%E8%E5a")) 



文章来源: Decoding a url-encoded windows-1251 (cp1251) string with JavaScript