Как вы пишете не ASCII символы Unicode, используя Java FileWriter? - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть тысячи HTML-файлов для обработки с использованием Groovy / Java, и мне нужно создать XML в конце. В некоторых файлах есть escape-последовательность символов ’. Когда я создаю выходной XML, последующий анализ этого XML жалуется на недопустимый символ Unicode в файле. Последовательность, которую я прохожу: HTML-файл-> HTMLCleaner-> SimpleXMLSerializer-> XMLSlurper-> CLOB (в HSQLDB) -> ClobInputStream-> FileWriter.

Как получить правильный код символа в выводе, чтобы синтаксический анализатор не жаловался?

Примечание. Этот вопрос был сильно изменен, чтобы правильно представлять реальную проблему. Комментарии ниже относятся к оригинальной версии.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2011

Хотя я согласен, что персонаж не должен вызывать каких-либо проблем, вот решение для очень больших файлов:

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 для простой замены статической строки.

0 голосов
/ 24 ноября 2011

Ответ в том, что 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/ для ответа.

0 голосов
/ 23 ноября 2011

Просто используйте replaceAll:

yourHtmlFiles.each { f ->
 text = f.text
 text.replaceAll('’', "'");
 // save text
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...