【问题标题】:Groovy - Encoding issue parsing Korean in XMLGroovy - 在 XML 中解析韩语的编码问题
【发布时间】:2014-04-08 20:52:15
【问题描述】:

我有一个 UTF-8 编码的 XML 文件(XMLSpy 和 NotePad++ 都将其显示为编码)。该文件包含韩语字符串,在两个编辑器中都可以正常显示。

<Table>
    <Column ss:StyleID="s63" ss:AutoFitWidth="0" ss:Width="290.25"/>
    <Row ss:AutoFitHeight="0">
        <Cell>
            <Data ss:Type="String">왕복</Data>
        </Cell>
    </Row>
    <Row ss:AutoFitHeight="0">
        <Cell>
            <Data ss:Type="String">..에서</Data>
        </Cell>
    </Row>
    <Row ss:AutoFitHeight="0">
        <Cell>
            <Data ss:Type="String">편도</Data>
        </Cell>
    </Row>
    <Row ss:AutoFitHeight="0">
        <Cell>
            <Data ss:Type="String">기내</Data>
        </Cell>
    </Row>
</Table>

我正在使用 Groovy 解析 XML 文件并将内容写入新的 XML 文件。

        XmlParser parser = new XmlParser();
        def inputSource = new InputSource(new FileReader(file));
        inputSource.setEncoding('UTF-8');

        def workbook = parser.parse(inputSource);

然后我将它写到一个新的 XML 文件中,指定 UTF-8,即使我认为不需要这样做。

        def finalFileWriter = new FileWriter(new File(file.getName()+"_clean.xml").asWritable('UTF-8'));
        def printer = new XmlNodePrinter(new PrintWriter(finalFileWriter));
        printer.preserveWhitespace = true;
        printer.print(workbook);

根据 XMLSpy 的说法,生成的 XML 文件包含不应出现在使用 UTF-8 的文件中的字符,因此会被垃圾替换。它们在 Notepad++ 中也显示不正确。两位编辑都说新文件是 UTF-8 编码的。

上面的代码在操作其他 3 个相同结构的文件时运行良好,分别是简体中文、繁体中文和日文。任何指导都会很棒。

谢谢

【问题讨论】:

  • 你有一些示例输入吗?
  • 感谢您将 XML 放入原始帖子 :)

标签: xml encoding utf-8 groovy


【解决方案1】:

如果我将您的输入 XML 放入 /tmp/input.xml,这似乎对我有用:

def workbook = new XmlParser(false, false).parse( '/tmp/input.xml' )

new File( '/tmp/test.xml' ).withWriter( 'UTF-8' ) { w ->
    new XmlNodePrinter( new PrintWriter( w ) ).with { p ->
        preserveWhitespace = true
        p.print( workbook )
    }
}

我必须告诉解析器忽略命名空间,因为您没有指定 ss: 命名空间是什么。

但是/tmp/test.xml 中的输出似乎是对的?

【讨论】:

  • 我会试一试 Tim 并回帖。感谢您对此进行调查,无论结果如何
  • 酷,交叉手指:-)
  • Tim... 你太棒了 :D 效果很好,非常感谢。所以更重要的是,为什么? :) 你知道为什么你解析文件并打印它的方式有效,但我的却遇到了字符问题吗?我将看一下 groovy API 以了解它对 withWriter() 和 PrintWriter() 的说明,因为它们是我们两种方法之间的区别(另外,您对我使用了不同的 XMLParser 构造函数)。我更像是一个 Groovy 黑客而不是程序员,所以仍然需要做更多的阅读。
  • @Shigsy 您的代码中的InputSourceFileReader 可能会丢失它。我的猜测是FileReader,为了检验这个假设,将def inputSource = new InputSource(new FileReader(file)) 替换为def inputSource = new InputSource(new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))),看看你的原始代码是否有效。正如您所看到的,Groovy 方式明显更短且更具可读性;-)
  • @Shigsy 至于不同的构造函数,我需要它,因为您提供的 xml 示例中没有命名空间定义。你有更完整的 xml,所以可能只需要 new XmlParser() 就可以了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多