我将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中找回纯文本吗?
我花了很多时间寻找节点或解析器的任何属性,并且我尝试对输出字符串进行后期处理,但是没有任何事情已经过时了。
感谢您的帮助!