我试图找到一种简单的 JS 方法将 RTF 转换为纯文本,我发现 that simple solution这似乎可以满足我的需求。但是,我的所有 RTF 都是葡萄牙语,其中有一些 Latin1 字符没有被上述函数替换。
我刚刚又放置了一个正则表达式来用 Javascript 的“\xhh”替换 RTF 的“\'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 中使用代码时,我无法获取返回的字符串,并替换其“\xhh”序列。这是结果示例:
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、我拥有的书籍中也找不到任何解释。
有人可以在这里阐明一下吗?谢谢!
法布里西奥
最佳答案
您收到一个带有转义字符的字符串,您需要对它们进行转义,就像我想象的那样简单。字符串中没有自动转义转义字符序列的魔力,这是正确的(否则你怎么能存储它们?)。
我认为您正在寻找这个:
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???
方法。
关于javascript - JS字符串变量: why aren´t special characters substituted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602017/