我有一个 WebSocket,可以从不同的服务向我的页面提供文本字符串。其中一些字符串包含奇怪的字符。
有时我会收到如下字符串:
“东西 %91 引用的东西 %92 东西”
和类似的。我发现这个特定的服务以 windows-1252(或 CP1252)字符集向我发送字符串。
使用 javascript 将我的所有字符串转换为 UTF-8 或仅转换十六进制字符,哪种方法是最好的(也是最快的)?
我有一个 WebSocket,可以从不同的服务向我的页面提供文本字符串。其中一些字符串包含奇怪的字符。
有时我会收到如下字符串:
“东西 %91 引用的东西 %92 东西”
和类似的。我发现这个特定的服务以 windows-1252(或 CP1252)字符集向我发送字符串。
使用 javascript 将我的所有字符串转换为 UTF-8 或仅转换十六进制字符,哪种方法是最好的(也是最快的)?
看起来你有百分比编码 的 Windows-1252字符。
replace
如果您创建从 Windows-1252 代码到 Unicode 字符的映射,您可以将它们替换为 。
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"
function cp1252_to_utf8(txt) {
return txt.replace(/%[0-9abcdef]{2}/gi, hex => {
return String.fromCharCode(parseInt(hex.replace('%', ''), 16));
});
}
我决定回答自己,因为还没有一个完整的,同时我想通了。感谢@Ciprian 提供字符映射的链接,并感谢@gre_gor 对替换功能的建议。
我找不到要复制的完整地图,所以我不得不合并其中一些建立在互联网上的地图来制作我自己的,我还写了一个“编码”功能,我想分享它以防其他人需要它.
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);
我希望它对某人有用
这是一个字符映射:
http://www.obkb.com/dcljr/charstxt.html
使用此代码替换代码中的字符:
var str = "stuff stuff %91quoted stuff%92 stuff";
var res = str.replace("%91", "‘");
另外,请检查此问题以进行多次替换: