Char de codificación en Java

Thomas Banderas :

Me archivo abierto con el bloc de notas, escribir allí: "A" Guardar y cerrar.

Trato de leer este archivo de dos maneras

Primero:

        InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
        int result = inputStream.read();
        System.out.println(result);
        System.out.println((char) result);

196 Ä

Segundo:

        InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
        Reader reader = new InputStreamReader(inputStream);
        int result = reader.read();
        System.out.println(result);
        System.out.println((char) result);

261 ±

Preguntas: 1) En el modo binario, esta carta se guarda como 196? ¿Por qué no como 261? 2) Esta carta se guarda como 196 en el que la codificación?

Trato de entender por qué hay diferencias

Pshemo:

UTF-8 valores Codifica de gama U+0080- U+07FFcomo dos bytes en forma 110xxxxx 10xxxxxx(más en wiki ). Así que sólo hay xxxxx xxxxxx11 bytes disponibles para el valor.

ąestá indexado como U + 0105 donde 0105es el valor hexadecimal (como decimal es 261). Como binaria que se puede representar como

      01       05    (hex)
00000001 00000101    (bin)
     xxx xxxxxxxx <- values for U+0080 - U+07FF range encode only those bits

     001 00000101 <- which means `x` will be replaced by only this part 

Así codificación UTF-8 añadirá 110xxxxx 10xxxxxxmáscara que significa que combinará

110xxxxx 10xxxxxx
   00100   000101

en (dos bytes):

11000100 10000101

Ahora, InputStreamlee los datos como bytes sin formato . Así que cuando se llama inputStream.read();primera vez que está recibiendo 11000100lo que es 196en decimal. Llamar inputStream.read();por segunda vez volvería 10000101, que es 133en decimal.

Readers ware introdujo en Java 1.1 para que pudiéramos evitar este tipo de desorden en nuestro código. En su lugar podemos especificar qué codificación lector debe usar (o dejar que se utilice uno por defecto) para obtener valores debidamente codificados, como en este caso 00000001 00000101(sin máscara) que es igual a 0105en forma hexadecimal y 261en forma decimal.


En breve

  • uso Readers (con la codificación adecuada especificada) si desea leer datos como texto,
  • su uso Streames que si quieres leer datos como bytes sin formato.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=202936&siteId=1
Recomendado
Clasificación