字符串.replace(fromCharCode() , '')无法替换字符。

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

但在屏幕上仍然显示“�”,你知道为什么会发生这种情况吗?

4个回答

8
字符代码实际上是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);

​Working example: http://jsfiddle.net/StURS/2/


感谢您的评论。但它仍然无法正确解析异常字符。这是我修改后的代码:testData = String.fromCharCode(253,255);xmlData = xmlData.replace(String.fromCharCode(253,255), " ");console.log(xmlData);但屏幕上仍然显示'�'。您知道它为什么还会发生吗? - user1127017

1

我曾遇到一个麻烦的 SQL-dump 问题,其中既包含有效的 UTF-8 代码,也包含无效的代码,需要进行更多手动转换。由于上面的示例没有解决替换和查找更好匹配项的问题,我认为在这里为那些正在处理类似编码问题的人提供一些帮助。以下代码:

  1. 解析我的 sql-dump
  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包含一个.,即可以匹配任何字符,需要额外加上\\

0
如果您需要全局替换文本中的所有字符,可以使用replace()函数。

let data = 'Hello' + String.fromCharCode(32,32,32) + 'World' + String.fromCharCode(32,32,32) + '!';

let find = String.fromCharCode(32,32,32) // 3x space
let regex = new RegExp(find, 'g');
let updatedData = data.replace(regex, ' _TEXT_ ');

alert(updatedData);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接