2014-06-25 2 views
3

Я пытаюсь использовать этот код (находится на Stackoverflow), чтобы удалить недопустимые символы UTF-8 символов:Java CharsetDecoder вставки пробела после каждого символа

def text = file.text 
CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder(); 
utf8Decoder.onMalformedInput(CodingErrorAction.IGNORE); 
utf8Decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); 
ByteBuffer bytes = ByteBuffer.allocate(text.getBytes().length * 2) 
CharBuffer cbuf = bytes.asCharBuffer() 
cbuf.put(text) 
cbuf.flip() 
CharBuffer parsed = utf8Decoder.decode(bytes); 
println parsed.toString() 

Выход я получаю выглядит так:

< d o c u m e n t > 
    < t i t l e > S o me T i t l e </t i t l e > 
    < s i t e > A S i t e </s i t e > 

Любые идеи о том, почему он так себя ведет?

+0

Есть ли postable вход вы можете предоставить? –

+0

Не следует ли указывать кодировку в 'text.getBytes()'? Я сомневаюсь, что это причина проблемы. Кроме того, указываете ли вы какую-либо кодировку при открытии/чтении файла? –

+0

Я подозреваю, что file.text использует кодировку символов платформы по умолчанию, но она [кажется, не указана] (http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText ()). Вероятно, вы должны использовать тот, который позволяет вам указать кодировку (http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText (java.lang.String)), иначе [File.getBytes()] (http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getBytes()) для получения необработанных байтов. В противном случае байты уже были преобразованы один раз уже, возможно, с неправильной кодировкой. –

ответ

1

Не знаю, почему это не работает, но это то, что установил его (код в Groovy, а не Java):

file.withInputStream { stream -> 
    CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder(); 
    utf8Decoder.onMalformedInput(CodingErrorAction.IGNORE); 
    utf8Decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); 
    def reader = new BufferedReader(new InputStreamReader(stream, utf8Decoder)) 
    def line = null 

    def sb = new StringBuilder() 
    while ((line = reader.readLine()) != null) { 
     sb.append("$line\n") 
    } 
    reader.close() 
} 
Смежные вопросы