如何使用Java FileWriter编写非ASCII Unicode字符?

时间:2011-11-23 00:39:26

标签: java html xml unicode groovy

我有数千个HTML文件要使用Groovy / Java进行处理,我需要在最后生成XML。某些文件中包含字符转义序列’。当我生成输出XML时,该XML的后续解析就是抱怨文件中存在非法的unicode字符。我要经历的顺序是HTML文件 - > HTMLCleaner-> SimpleXMLSerializer-> XMLSlurper-> CLOB(在HSQLDB中) - > ClobInputStream-> FileWriter。

如何在输出中获取正确的字符代码,以便解析器不会抱怨?

注意:此问题已经过大量修改,无法正确表示真正的问题。以下评论涉及原始版本。

3 个答案:

答案 0 :(得分:0)

只需使用replaceAll

yourHtmlFiles.each { f ->
 text = f.text
 text.replaceAll('’', "'");
 // save text
}

答案 1 :(得分:0)

虽然我同意这个角色不会引起任何问题,但这里有一个非常大的文件的解决方案:

def replaceSingleQuoteCharacterInFile(def input) {
    if(input instanceof String) {
        input = new File(input)
    }
    File out = File.createTempFile("temp_xml", ".xml")
    out.withPrintWriter('UTF-8') { writer ->
        input.eachLine('UTF-8') { line ->
            writer.println line.replace('’', "'");
        }
    }
    out.renameTo(input)
}

def input = new File('/path/to/input.xml')
replaceSingleQuoteCharacterInFile(input)

println input.text

这将逐行流式传输文件,直接替换有问题的字符。它还将输出流式传输到临时文件,然后替换最后的原始文件,以防止在处理过程中损坏输入文件。

另请注意使用replace代替replaceAll - 没有理由使用regex进行简单的静态字符串替换。

答案 2 :(得分:0)

答案是java.io.FileWriter默认情况下不使用UTF-8编码。而是使用以下代码来创建编写器:

def writer = new OutputStreamWriter(new FileOutputStream(outputFile),"UTF-8")

给答案提示http://www.malcolmhardie.com/weblogs/angus/2004/10/23/java-filewriter-xml-and-utf-8/