Maison >Java >javaDidacticiel >Exemple d'analyse de codage de caractères Java

Exemple d'analyse de codage de caractères Java

PHPz
PHPzavant
2023-05-09 14:13:071461parcourir

1. Les fichiers Java sont compilés pour former une classe

L'encodage des fichiers Java ici peut être diversifié, mais le compilateur Java convertira automatiquement ces encodages en fonction Java Le fichier de classe est généré une fois le format de codage du fichier lu correctement. Le codage du fichier de classe ici est le codage Unicode (en particulier, le codage UTF-16).

Définissez donc une chaîne dans le code Java :

String s="Caractères chinois";

Peu importe ce que le fichier java utilise avant la compilation Une fois l’encodage compilé dans une classe, ils sont tous identiques : représentation de l’encodage Unicode.

2. Encodage dans la JVM

Lorsque la JVM charge le fichier de classe et le lit, utilisez l'encodage Unicode pour lire correctement le fichier de classe, alors la définition originale String s="Caractères chinois" ; la représentation en mémoire est un codage Unicode.

Lorsque String.getBytes() est appelé, la cause du code tronqué a en fait été trouvée. Parce que cette méthode utilise le jeu de caractères par défaut de la plateforme pour obtenir le tableau d'octets correspondant à la chaîne. Dans la version chinoise de Windows 🎜#

Lorsque différents systèmes et bases de données ont été codés plusieurs fois, si vous ne comprenez pas les principes, cela conduira facilement à un code tronqué. Par conséquent, dans un système, il est nécessaire d’unifier l’encodage des chaînes. Cette unification est vaguement appelée unification externe. Par exemple, les paramètres de chaîne de méthode, les flux IO, dans les systèmes chinois, vous pouvez utiliser GBK, GB13080, UTF-8, UTF-16, etc., mais vous devez choisir des jeux de caractères plus grands pour garantir que tous les caractères pouvant être utilisés Tout peut être affiché normalement pour éviter le problème des caractères tronqués. (En supposant que les codes ASCII soient utilisés pour tous les fichiers) La conversion bidirectionnelle est alors impossible.

Il convient de noter que l'UTF-8 ne prend pas en charge tous les encodages de jeux de caractères chinois. Par conséquent, dans des circonstances particulières, des caractères tronqués peuvent apparaître lors de la conversion d'UTF-8 en GB18030. Lorsque je travaille sur des systèmes chinois, j'aime utiliser l'encodage UTF-8 sans pouvoir expliquer pourquoi ! Le plus stupide est que plusieurs personnes travaillent sur un système. Certaines personnes utilisent l'encodage GBK pour les fichiers de code source, d'autres utilisent UTF-8 et d'autres utilisent GB18030. FK, ils sont tous chinois, et ce n'est pas un projet d'externalisation. Pourquoi utiliser UTF-8 c'est fou ! Il est acceptable d'utiliser GBK18030 pour tous les codes sources, afin d'éviter le codage de caractères non reconnus lors de la compilation du script ANT.

Par conséquent, pour le système chinois, il est préférable de choisir l'encodage GBK ou GB18030 (en fait, GBK est un sous-ensemble de GB18030) pour éviter au maximum les caractères tronqués.

3. Encodage des chaînes en mémoire

Les chaînes en mémoire ne se limitent pas à celles chargées directement à partir du code de classe. lus à partir de fichiers texte, certains sont lus à partir de bases de données et certains peuvent être construits à partir de tableaux d'octets. Cependant, ils ne sont fondamentalement pas codés en Unicode. La raison est très simple.

Par conséquent, divers problèmes d'encodage doivent être traités. Avant le traitement, l'encodage de la "source" doit être clair, puis correctement lu dans la mémoire en utilisant la méthode d'encodage spécifiée. S'il s'agit d'un paramètre de méthode, l'encodage du paramètre chaîne doit effectivement être clair, car ce paramètre peut être transmis depuis un autre système japonais. Lorsque le codage de la chaîne est clair, la chaîne peut être traitée correctement si nécessaire pour éviter les caractères tronqués.

Lors du décodage et de l'encodage d'une chaîne, la méthode suivante doit être appelée :

public class Test {   public static void main(String[] args) {   System.out.println("当前JRE:" + System.getProperty("java.version"));   System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());   }   }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer