7

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

3 回答 3

8

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

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

字符串String.fromCharCode(253,255)由两个字符组成。

于 2012-06-21T10:56:57.537 回答
2

你应该调用replace()一个字符串实例而不是String

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

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

于 2012-06-21T10:01:06.307 回答
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包含 a ,.即匹配任何内容并需要附加\\
于 2016-07-09T08:46:52.453 回答