string.replace(fromCharCode(),'')不能替换字符

时间:2012-06-21 09:45:32

标签: javascript fromcharcode

当我解析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);

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

你知道为什么会这样吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

对于包含有效UTF-8代码且无效强制进行更多手动转换的混乱SQL转储存在此问题。由于上面的例子没有解决替换并找到更好的匹配,我认为我把我的两分钱放在这里为那些正在努力解决类似编码问题的人。以下代码:

  1. 解析我的sql-dump
  2. 根据查询进行拆分
  3. 查找256范围之外的字符代码
  4. 输出代码和带有代码出现的上下文的字符串
  5. 使用正则表达式用正确的代码替换瑞典语ÅÄÖ
  6. 输出替换的字符串以进行控制
  7. "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包含.,即匹配任何内容并需要额外的\\