Rhino AstNode toSource方法编码在ISO-8859-1中?

时间:2014-10-21 13:48:39

标签: java encoding rhino

我将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中找回纯文本吗?

我花了很多时间寻找节点或解析器的任何属性,并且我尝试对输出字符串进行后期处理,但是没有任何事情已经过时了。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

似乎StringLiteral#toSource() escapes the value

如果您只想包含封闭的引用,请尝试:

StringLiteral sl = (StringLiteral) node;
String value = sl.getValue(true); // "Glück"