【问题标题】:Find hex (windows1252) string within a string and convert it - Javascript在字符串中查找十六进制(windows1252)字符串并将其转换 - Javascript
【发布时间】:2015-10-06 15:37:54
【问题描述】:

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

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

“东西 %91 引用的东西 %92 东西”

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

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

【问题讨论】:

  • 你能发布你的代码吗?您可以使用str.replace() 函数。
  • 所以你建议制作一个“cp1252”地图并简单地使用str.replace??我还没有任何代码,因为我尝试使用“htmlentities”和“decodeURIComponent”ecc ecc。你知道我最终在哪里可以找到一个比较表来复制并用作地图吗?
  • 在下面查看我的答案。
  • 你应该不需要自己转换它;听起来编码在输入端被错误标记,进入服务器......

标签: javascript string utf-8 character-encoding windows-1252


【解决方案1】:

看起来你有 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"

【讨论】:

    【解决方案2】:

    这是一个字符映射:

    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

    【讨论】:

      【解决方案3】:

      我决定回答自己,因为还没有一个完整的答案,同时我想通了。 感谢@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);
      

      希望对大家有用

      【讨论】:

        【解决方案4】:
        function cp1252_to_utf8(txt) {
            return txt.replace(/%[0-9abcdef]{2}/gi, hex => {
                return String.fromCharCode(parseInt(hex.replace('%', ''), 16));
            });
        }
        

        【讨论】:

        • 您的答案因其长度和内容而被标记为低质量。请考虑解释您的代码的作用。
        • 虽然答案总是很受欢迎,但它确实有助于提供一些有关您的代码如何解决手头问题的信息。不是每个人都熟悉您的确切编码逻辑,但可能了解您的一般方法概念。为了帮助改进您的答案,请提供一些context surrounding your answer,并查看writing great answers 上的帮助文章以获取有关如何使您的答案重要的一些提示:)
        猜你喜欢
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 2018-01-31
        • 2020-11-07
        相关资源
        最近更新 更多