【问题标题】:string.replace(fromCharCode() , '') cannot replace charactersstring.replace(fromCharCode() , '') 不能替换字符
【发布时间】:2012-06-23 12:48:53
【问题描述】:

当我解析 XML 时,它包含异常的十六进制字符。 所以我试图用空白空间替换它。但它根本不起作用。

原始字符:Ø

hex code : (253, 255)

代码:

xmlData = String.replace(String.fromCharCode(253,255)," ");

retrun xmlData;

我想从描述中删除“ýÿ”字符。 是否有人在将十六进制字符替换为空白时遇到问题?

根据答案,我将代码修改如下:

testData = String.fromCharCode(253,255);
xmlData = xmlData.replace(String.fromCharCode(253,255), " "); 
console.log(xmlData);

但它仍然在屏幕上显示“�”..

你知道为什么还会发生这种情况吗?

【问题讨论】:

    标签: javascript fromcharcode


    【解决方案1】:

    刚刚遇到了一个混乱的 SQL 转储问题,其中包含有效的 UTF-8 代码和无效的强制更多手动转换。由于上面的例子没有解决替换和寻找更好的匹配,我想我把我的两分钱放在了这里,用于那些在类似编码问题上苦苦挣扎的人。以下代码:

    1. 解析我的 sql 转储
    2. 根据查询拆分
    3. 查找 256 范围之外的字符代码
    4. 输出代码和带有代码出现的上下文的字符串
    5. 使用正则表达式将瑞典语 ÅÄÖ 替换为正确的代码
    6. 输出替换后的字符串用于控制
    "use strict";
    
    const readline = require("readline");
    const fs = require("fs");
    
    var fn = "my_problematic_sql_dump.sql";
    var lines = fs.readFileSync(fn).toString().split(/;\n/);
    
    const Aring = new RegExp(String.fromCharCode(65533) +
        "\\" + String.fromCharCode(46) + "{1,3}", 'g');
    const Auml = new RegExp(String.fromCharCode(65533) +
        String.fromCharCode(44) + "{1,3}", 'g');
    const Ouml = new RegExp(String.fromCharCode(65533) +
        String.fromCharCode(45) + "{1,3}", 'g');
    
    for (let i in lines){
        let l = lines[i];
        for (let ii = 0; ii < l.length; ii++){
            if (l.charCodeAt(ii) > 256){
                console.log("\n Invalid code at line " + i + ":")
                console.log("Code: ", l.charCodeAt(ii), l.charCodeAt(ii + 1),
                    l.charCodeAt(ii + 2), l.charCodeAt(ii + 3))
    
                let core_str = l.substring(ii, ii + 20)
                console.log("String: ", core_str)
    
                core_str = core_str.replace(/[\r\n]/g, "")
                .replace(Ouml, "Ö")
                .replace(Auml, "Ä")
                .replace(Aring, "Å")
                console.log("After replacements: ", core_str)
            }
        }
    }
    

    生成的输出将如下所示:

     Invalid code at line 18:
    Code:  65533 45 82 65533
    String:  �-R�,,LDRALEDIGT', N
    After replacements:  ÖRÄLDRALEDIGT', N
    
     Invalid code at line 18:
    Code:  65533 44 44 76
    String:  �,,LDRALEDIGT', NULL
    After replacements:  ÄLDRALEDIGT', NULL
    
     Invalid code at line 19:
    Code:  65533 46 46 46
    String:  �...ker med fam till
    After replacements:  Åker med fam till
    

    我发现一些值得注意的事情:

    • 65533 后面有时会跟随不同数量的常规字符,这些字符决定实际字符,因此{1,3}
    • Aring 包含 .,即匹配任何内容并需要额外的 \\

    【讨论】:

      【解决方案2】:

      字符代码实际上是 255 * 256 + 253 = 65533,所以你会得到这样的结果:

      xmlData = xmlData.replace(String.fromCharCode(65533)," ");
      

      字符串String.fromCharCode(253,255) 有两个字符。

      【讨论】:

        【解决方案3】:

        您应该在字符串实例上调用replace() 而不是String

        var testData = String.fromCharCode(253,255);
        var xmlData = testData.replace(String.fromCharCode(253,255), " ");
        alert(xmlData);
        

        ​工作示例:http://jsfiddle.net/StURS/2/

        【讨论】:

        • 感谢您的评论。但它也无法正确解析异常字符。这是我修改后的代码.. testData = String.fromCharCode(253,255); xmlData = xmlData.replace(String.fromCharCode(253,255), "");控制台.log(xmlData);但它仍然在屏幕上显示'�'..你知道为什么它仍然会发生吗???
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2021-05-20
        • 1970-01-01
        • 2015-08-05
        • 2018-05-17
        • 1970-01-01
        相关资源
        最近更新 更多