Faire face à un flux d'octets, sa signification réelle ne peut pas être connue sans spécifier son encodage.
Cette phrase devrait également être ce dont nous nous souvenons toujours dans nos esprits lorsque l'on fait face au problème du "caractère à l'octet, octet au caractère". Sinon, des problèmes brouillés peuvent suivre.
En fait, l'essence du problème brouillé est que l'encodage et le décodage n'utilisent pas le même codage. Si vous comprenez ce principe, il est facile de résoudre le problème brouillé.
Couramment utilisés en Java sont les suivants:
1. La classe de chaîne utilise la chaîne de constructeur (octet [] octets) de l'octet []. La classe String fournit deux surcharges en même temps (1) chaîne (octet [] octets, charse charse)
(2) String (octet [] octets, String charSetName) est utilisé pour spécifier le codage.
2. La fonction GetBytes Byte [] GetBytes () de la classe String a également les deux surcharges suivantes:
(1) octet [] Getbytes (Charset Charset)
(2) BYTE [] GetBytes (String charSetName)
Tout ce qui ne nécessite pas le codage spécifié est obtenu à l'aide du charset par défaut de la plate-forme, qui peut être obtenu à l'aide de System.getProperty ("file.encoding"), charset.defaultcharset ().
3. L'impression de PrintStream (chaîne S) est également conçue sur ce problème. Pour cette raison, le constructeur de PrintStream n'est pas seulement PrintStream (fichier de fichier) et PrintStream (fichier de fichier, chaîne CSN)
Sinon, les caractères de la chaîne sont convertis en octets en fonction de l'encodage de caractères par défaut de la plate-forme,
DataOutputStream Construction n'a pas de méthode pour spécifier le codage, mais il fournit un writeUtf (String Str)
Donnez les exemples au début pour illustrer la nécessité de spécifier le codage:
Si une page Web spécifie le codage comme UTF-8, <meta http-equiv = "contenu-type" content = "text / html; charset = utf-8" />, il y a un formulaire sur la page, soumis à un servlet
Ensuite, le flux d'octet passé par les caractères entrés par l'utilisateur encodage selon le codage spécifié. Par exemple, si vous entrez "bonjour bonjour", si c'est UTF-8, alors le transmis est le suivant:
[104, 101, 108, 108, 111, -28, -67, -96, -27, -91, -67]
, Nous voyons que chacun des caractères chinois suivants utilise 3 octets, qui peuvent être utilisés pour désigner les connaissances pertinentes de l'UTF-8.
Mais si votre page spécifie GBK, la transmission sera différente:
[104, 101, 108, 108, 111, -60, -29, -70, -61]
Par conséquent, lors de l'utilisation de request.getParamètre du côté servlet, il doit être appelé en interne
String s = new String (bytes, réponse.getEncoding ()). Si votre réponse ne définit pas le codage, le codage par défaut NULL sera converti en GBK pour la plate-forme Java, puis les Chinois seront brouillés.
Par conséquent, afin d'éviter le code brouillé, les sites JSP définissent généralement un filtre et toutes les pages et serviteurs sont définis pour avoir un codage unifié. Response.SetEncoding, request.setEncoding.
À l'intérieur de la chaîne Java se trouve un char [], qui est une unité codée avec UTF-16 stockée 16 bits. À cette fin, lors de la conversion de caractères et de chaînes en octets et de les sortir en fichiers ou réseaux, ou en retournant des flux d'octets lus à partir de fichiers ou de réseaux à des caractères avec une signification pratique, vous devez comprendre quel est leur codage.
Certaines expériences
1. La classe de chaîne est toujours stockée dans un codage Unicode.
2. Faites attention à l'utilisation de string.getBytes ():
Si le paramètre de jeu de caractères n'est pas inclus, il dépendra du codage du jeu de caractères du JVM. Il est généralement Unicode sur Linux et GBK sous Windows. (Si vous souhaitez modifier le codage du jeu de caractères par défaut du JVM, utilisez l'option -dfile.encodeing = UTF-8 Lorsque vous démarrez le JVM.
Pour des raisons de sécurité, il est recommandé de toujours appeler avec des paramètres, par exemple: chaîne S; S.GetBytes ("UTF-8").
3. La classe de charme est très utile.
(1) Charset.Encode est encodant, c'est-à-dire en codant la chaîne dans le format de codage de jeu de caractères que vous spécifiez et la sortie d'un tableau d'octets.
(2) Charset.decode est le décodage, c'est-à-dire décoder un tableau d'octet dans le format de codage de jeu de caractères que vous spécifiez et le sortez dans une chaîne.
Par exemple:
String s = charset.defaultCharset (). DisplayName (); String S1 = "Je t'aime, mon amour"; Bytebuffer bb1 = bytebuffer.wrap (s1.getBytes ("utf-8")); pour (octet bt: bb1.array ()) {System.out.printf ("% x", bt); } // char [] usage char [] charray = {'i', 'l', 'o', 'v', 'e', 'you'}; // Utilisation de Charbuffer Charbuffer CB = Charbuffer.wrap (Charray); // Pointeur de repositionnement cb.flip (); String s2 = new String (Charray); // ByteBuffer Utilisation ByteBuffer BB2 = Charset.Forname ("UTF-8"). Encode (CB); // Utilisez Charset pour encoder comme un jeu de caractères spécifié ByteBuffer BB3 = charset.forname ("UTF-8"). Encode (S1); octet [] b = bb3.array (); // Utilisez Charset pour décoder en tant que chaîne en fonction du jeu de caractères spécifié ByteBuffer BB4 = ByteBuffer.Wrap (B); String s2 = charset.forname ("utf-8"). Decode (bb4) .toString ();