在字符串中查找十六进制 (windows1252) 字符串并将其转换 - Javascript

Find hex (windows1252) string within a string and convert it - Javascript

我有一个 WebSocket,可以从不同的服务向我的页面传送文本字符串。其中一些字符串包含奇怪的字符。

有时我会收到如下字符串:

"stuff stuff %91quoted stuff%92 stuff"

和类似的。我发现此特定服务以 windows-1252(或 CP1252)字符集向我发送字符串。

使用 javascript 将我的所有字符串都转换为 UTF-8 或仅转换十六进制字符,哪种方法最好(也是最快)?

这是人物图:

http://www.obkb.com/dcljr/charstxt.html

使用此代码替换代码中的字符:

var str = "stuff stuff %91quoted stuff%92 stuff";
var res = str.replace("%91", "‘");

此外,请检查此问题以进行多次替换:

Replace multiple strings at once

看起来你有 percent encoded Windows-1252 个字符。

如果您创建从 Windows-1252 代码到 Unicode 字符的映射,您可以将它们替换为 replace

var win1252toUnicode = {
    ...
    91:"‘",
    92:"’",
    ...
};
var encoded = "stuff stuff %91quoted stuff%92 stuff";
var decoded = encoded.replace(/%([0-9abcdef]{2})/ig, function(match, code) {
    return win1252toUnicode[code];
})

有了这个你会得到:

"stuff stuff ‘quoted stuff’ stuff"

我决定自己回答,因为还没有完整的答案,同时我想出了答案。 感谢@Ciprian 提供 link 到字符映射,感谢 @gre_gor 提供替换功能的建议。

我找不到完整的地图来复制,所以我不得不合并一些在网上找到的地图来制作我自己的,我也写了一个功能给"encode",我想分享以防其他人需要它。

function cp1252_to_utf8(txt) {
var chars_map = {
    "21": "!", "22": '"', "23": "#", "24": "$", "25": "%", "26": "&", "27": "'", "28": "(", "29": ")", "2a": "*", "2b": "+", "2c": ",",
    "2d": "-", "2e": ".", "2f": "/", "30": "0", "31": "1", "32": "2", "33": "3", "34": "4", "35": "5", "36": "6", "37": "7", "38": "8",
    "39": "9", "3a": ":", "3b": ";", "3c": "<", "3d": "=", "3e": ">", "3f": "?", "40": "@", "41": "A", "42": "B", "43": "C", "44": "D",
    "45": "E", "46": "F", "47": "G", "48": "H", "49": "I", "4a": "J", "4b": "K", "4c": "L", "4d": "M", "4e": "N", "4f": "O", "50": "P",
    "51": "Q", "52": "R", "53": "S", "54": "T", "55": "U", "56": "V", "57": "W", "58": "X", "59": "Y", "5a": "Z", "5b": "[", "5c": "\",
    "5d": "]", "5e": "^", "5f": "_", "60": "`", "61": "a", "62": "b", "63": "c", "64": "d", "65": "e", "66": "f", "67": "g", "68": "h",
    "69": "i", "6a": "j", "6b": "k", "6c": "l", "6d": "m", "6e": "n", "6f": "o", "70": "p", "71": "q", "72": "r", "73": "s", "74": "t",
    "75": "u", "76": "v", "77": "w", "78": "x", "79": "y", "7a": "z", "7b": "{", "7c": "|", "7d": "}", "7e": "~", "a1": "¡", "a2": "¢",
    "a3": "£", "a4": "¤", "a5": "¥", "a6": "¦", "a7": "§", "a8": "¨", "a9": "©", "aa": "ª", "ab": "«", "ac": "¬", "a0": " ", "ae": "®",
    "af": "¯", "ad": " ", "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": "þ", "ff": "ÿ", "91": "‘", "92": "’",
    "80": "€", "83": "ƒ", "85": "…", "86": "†", "87": "‡", "88": "ˆ", "89": "‰", "8a": "Š", "8b": "‹", "8c": "Œ", "8e": "Ž", "93": "“",
    "94": "”", "95": "•", "96": "–", "97": "—", "98": "˜", "99": "™", "9a": "š", "9b": "›", "9c": "œ", "9e": "ž", "9f": "Ÿ"
};
return txt.replace(/%([0-9abcdef]{2})/ig, function (match, code) {
    return chars_map[code];
});
}

它显然会像这样使用:

var utf8_txt = cp1252_to_utf8(cp1552_txt);

希望对大家有用

function cp1252_to_utf8(txt) {
    return txt.replace(/%[0-9abcdef]{2}/gi, hex => {
        return String.fromCharCode(parseInt(hex.replace('%', ''), 16));
    });
}