我将js字符串解析为抽象语法树,然后更改StringLiteral节点的值,并且需要将整个Ast内容写回到字符串中。
但是,当我使用toSource方法时,来自StringLiterals值的特殊字符在ISO-8859-1中进行编码。
例:
在课堂测试中:
public static void main(){
testString = " Assignment = 'Glück'; "
CompilerEnvirons env = new CompilerEnvirons();
AstRoot astRoot = new Parser(env).parse(testString, null, 1);
PrintVisitor visitor = new PrintVisitor();
astRoot.visitAll(visitor);
}
在类PrintVisitor中扩展NodeVisitor:
@Override
public boolean visit(AstNode node) {
if (node.getClass() == StringLiteral.class){
StringLiteral sl = (StringLiteral) node;
System.out.println("value: " + sl.getValue());
System.out.println("src: " + sl.toSource());
}
}
输出:
value: Glück
src: 'Gl\xfcck"
如您所见,该值以正确的编码存储,但是toSource方法返回转义的ISO-8859-1字符。
您是否知道任何使toSource方法返回UTF-8的方法?
还是您可以建议采用其他任何方式来逆转解析过程,以便让我从整个ast那里获取纯文本?
我花了很多时间寻找节点或解析器的任何属性,并尝试对输出字符串进行后处理,但未找到任何结果。
感谢您的帮助!
最佳答案
似乎是StringLiteral#toSource()
escapes the value。
如果只想包含随附的报价,请尝试:
StringLiteral sl = (StringLiteral) node;
String value = sl.getValue(true); // "Glück"