2011-09-02 14 views
19

Por ejemplo, he siguiente códigoCómo omitir caracteres no válidos en la secuencia en Java/Scala?

Source.fromFile(new File(path), "UTF-8").getLines() 

y se ha producido una excepción

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1 
    at java.nio.charset.CoderResult.throwException(CoderResult.java:260) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319) 

No me importa si algunas líneas no se leen, pero la forma de salto caracteres no válidos y seguir las líneas de lectura?

Respuesta

32

Puede influir en la forma en que la decodificación del juego de caracteres maneja la entrada no válida llamando al CharsetDecoder.onMalformedInput.

Por lo general, usted no va a ver nunca un objeto CharsetDecoder directamente, porque se creará detrás de las escenas para usted. Por lo tanto, si necesita acceder, necesitará usar la API que le permite especificar el CharsetDecoder directamente (en lugar de solo el nombre de codificación o el Charset).

El ejemplo más básico de tales API es el InputStreamReader:

InputStream in = ...; 
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); 
decoder.onMalformedInput(CodingErrorAction.IGNORE); 
Reader reader = new InputStreamReader(in, decoder); 

Tenga en cuenta que este código utiliza la clase Java 7 StandardCharsets, para versiones anteriores sólo tiene que reemplazarlo con Charset.forName("UTF-8") (o utilizar the Charsets class de Guava) .

+3

+1 por introducirme en StandardCharset. Lo he querido por tanto tiempo. No más 'catch (UnsupportedEncodingException e) {// never happens}' – Thilo

+5

@Thilo: si está atascado con Java 6, entonces Guava proporciona [la clase 'Charsets'] (http://guava-libraries.googlecode.com /svn/trunk/javadoc/com/google/common/base/Charsets.html) que hace lo mismo. –

+0

En realidad soy. Gracias ;-) – Thilo

13

Bueno, si no es UTF-8, es algo más. El truco es averiguar lo que hay algo más, pero si lo que quieres es evitar los errores, puede utilizar una codificación que no tiene códigos no válidos, tales como latin1:

Source.fromFile(new File(path), "latin1").getLines() 
+1

¡Esta solución realmente funciona para mí! –

1

tuve un problema similar , y uno de los códecs incorporados de Scala hizo el truco para mí:

Source.fromFile(new File(path))(Codec.ISO8859).getLines() 
+0

¡Vaya, no tengo idea de por qué funcionó, pero me salvaste la noche! – habitats

0

Si se quiere evitar que utilizan caracteres no válidos Scala, encontré esto funcionó para mí.

import java.nio.charset.CodingErrorAction 
import scala.io._ 

object HelloWorld { 

    def main(args: Array[String]) = { 
    implicit val codec = Codec("UTF-8") 

    codec.onMalformedInput(CodingErrorAction.REPLACE) 
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE) 

    val dataSource = Source.fromURL("https://www.foo.com") 

    for (line <- dataSource.getLines) { 

     println(line) 
    } 
    } 
} 
Cuestiones relacionadas