JS字符串变量:为什么不替换特殊字符?

时间:2017-01-11 22:38:24

标签: javascript regex string rtf

我正在尝试找到一种简单的JS方法将RTF转换为纯文本,我发现that simple solution似乎满足了我的需求。但是,我的所有RTF都是葡萄牙语,其中一些Latin1字符不会被上述功能所取代。

我只是放了一个正则表达式来代替RTF的“\ _ hh ”序列,用Javascript的“\ x hh ”,所以我有:

function convertToPlain(rtf) {
    rtf = rtf.replace(/\\par[d]?/g, "")

    rtf = rtf.replace(/\{\*?\\[^{}]+}|[{}]|\\\n?[A-Za-z]+\n?(?:-?\d+)?[ ]?/g, "").trim()

    rtf = rtf.replace(/\\'/g, '\\x')

    return rtf;
}

替换发生了。但是,使用JSFiddle中的代码,我无法获得返回的字符串,其中“\ x hh ”序列被替换。以下是结果示例:

 a inaugura\xe7\xe3o do novo Castel\xe3o, para as competi\xe7\xf5es

但是,如果我更改return语句以将上述示例用作文字,例如......

return " a inaugura\xe7\xe3o do novo Castel\xe3o, para as competi\xe7\xf5es"

...字符按预期替换:

 a inauguração do novo Castelão, para as competições

似乎字符串变量(但不是字符串文字)会导致其特殊字符无法替换。但是,我在SO中找不到任何解释,也没有在MSDN,W3C,我的书中找到任何解释。

有人可以在这里曝光吗?谢谢!

法布里西奥

1 个答案:

答案 0 :(得分:1)

你得到的是一个带有转义字符的字符串,你需要对它们进行解读,就像我想象的那样简单。字符串中没有任何魔法可以自动转换转义的字符序列,这是理所当然的(否则你怎么能存储它们?)。

我认为你正在寻找这个:

How do I decode a string with escaped unicode?

表达的常用方法是使用unescape(JSON.parse(...))(请参阅链接中的示例),否则您必须自己扫描并转换它们(该页面上接受的答案)。

还有另一种方法使用eval('"'+s+'"'),但从未对从服务器端接收的文本执行此操作。如果你100%确定这样做是安全的(即使Doug Crockford在他的JSON解析器中使用它)也没关系。

以下是为您的案例编辑的已接受答案中的代码:

var x = "a inaugura\\xe7\\xe3o do novo Castel\\xe3o, para as competi\\xe7\\xf5es";
var r = /\\u([\d\w]{4})|\\x([\d\w]{2})/gi;
x = x.replace(r, function (match, grp, grp2)) {
    return String.fromCharCode(parseInt(grp||grp2, 16)); } );
x = unescape(x);
console.log(x);

结果:

a inauguração do novo Castelão, para as competições

注意:代码更改主要在正则表达式中,添加|\\x([\d\w]{2})并将{4}更改为{2},并支持\x,因为您使用的是1字节十六进制转义字符(0x??,对于256以下的字符)而不是2字节的unicode \u????方法。