Char de codage en Java

drapeaux Thomas:

Je fichier ouvert avec le bloc-notes, il écrire: « A » Enregistrer et fermer.

J'essaie de lire ce fichier de deux façons

Premier:

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

196 Ä

Seconde:

        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 ±

Questions: 1) En mode binaire, cette lettre est enregistrée comme 196? Pourquoi pas 261? 2) Cette lettre est enregistrée comme 196 dans lequel le codage?

J'essaie de comprendre pourquoi il y a des différences

Pshemo:

UTF-8 encode les valeurs de la gamme U+0080- U+07FFque deux octets de forme 110xxxxx 10xxxxxx(plus au wiki ). Donc , il n'y a que xxxxx xxxxxx11 octets disponibles pour la valeur.

ąest répertorié U + 01050105est la valeur hexadécimale (en décimal il est 261). Comme binaire , il peut être représenté comme

      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 

Donc encodage UTF-8 va ajouter un 110xxxxx 10xxxxxxmasque qui signifie qu'il combinera

110xxxxx 10xxxxxx
   00100   000101

en (deux octets):

11000100 10000101

Maintenant, InputStreamlit les données comme octets bruts . Donc , lorsque vous appelez la inputStream.read();première fois que vous obtenez ce 11000100qui est 196en décimal. L' appel inputStream.read();deuxième fois retournerait 10000101qui est 133en décimal.

Readers ware introduit en Java 1.1 afin que nous puissions éviter ce genre de désordre dans notre code. Au lieu de cela , nous pouvons spécifier quel encodage doit utiliser lecteur (ou le laisser utiliser une valeur par défaut) pour obtenir des valeurs correctement codées comme dans ce cas 00000001 00000101(sans masque) qui est égale à 0105sous forme hexadécimale et 261sous forme décimale.


En bref

  • utilisation Readers (avec le codage correctement spécifié) si vous souhaitez lire les données sous forme de texte,
  • l' utilisation Streamest si vous voulez lire les données brutes sous forme d' octets.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=202933&siteId=1
conseillé
Classement