Maison >Java >JavaBase >Des caractères tronqués apparaissent lors de la conversion d'octet[] en chaîne en Java

Des caractères tronqués apparaissent lors de la conversion d'octet[] en chaîne en Java

王林
王林original
2019-11-27 09:28:0010401parcourir

Des caractères tronqués apparaissent lors de la conversion d'octet[] en chaîne en Java

Tout d'abord, il est très simple de convertir directement l'octet[] couramment utilisé en chaîne :

public static void main(String[] args) {  
String str="我是中国人";  
byte[] arr=str.getBytes();  
System.out.println("打印:"+arr);
for(byte e : arr) {
System.out.print(e + " ");
}
String str2=new String(arr);  
System.out.println("\n打印2:"+str2);  
}

Vidéos recommandées sur Java : apprentissage Java

Par exemple, le résultat de sortie de ce qui précède est :

打印:[B@15db9742
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53 
打印2:我是中国人

Vous connaîtrez l'encodage lorsque vous verrez cela. l'octet correspond à un octet et les caractères chinois à deux octets. Par conséquent, cinq caractères chinois nécessitent dix types de stockage numérique. Ensuite, les nombres sont transformés en caractères chinois et il y a un processus de codage des normes.

Alors, comment l'encodage des caractères est-il géré en Java ?

JAVA utilise sa propre classe String, et les objets de la classe String n'ont pas besoin de spécifier une table de codage ! Pourquoi sait-il quels caractères représente chacun d'un groupe de nombres ? En effet, les informations sur les caractères dans String sont stockées en codage UNICODE. Afin de représenter des caractères (notez qu'il s'agit de caractères uniques), JAVA a également le type de données char et sa taille est une longueur fixe de deux chiffres hexadécimaux à 8 chiffres, soit 0 ~ 65535. Le but est de correspondre à un caractère en UNICODE.

Si vous souhaitez obtenir un numéro UNICODE dans une chaîne, vous pouvez utiliser la méthode getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) pour obtenir un char[]. Ce char[] représente le caractère String et est un nombre codé dans l'encodage UNICODE. tableau.

Pourquoi y a-t-il du code tronqué lors de la conversion d'octet[ ] en chaîne ?

Évidemment, comme mentionné ci-dessus, les normes de codage sont différentes. Par exemple, le mot chinois « dang » dans la norme GB2312 est représenté par deux nombres à huit chiffres 0xB5 et 0xB1. Sur le système anglais, il n'y a pas de table d'encodage GB2312. Si vous lui donnez un 0xB5, 0xB1, il sera traité en ASCII. Mettez-le en Java et il le traitera selon sa propre spécification UNICODE, donc si les spécifications sont différentes, des résultats étranges apparaîtront, c'est-à-dire des caractères tronqués.

Alors, comment pouvons-nous résoudre le problème tronqué de la conversion de byte[] en String ?

Cela dépend d'où vient l'octet[]. Il arrive souvent qu'une image doive être convertie en byte[] puis convertie en un objet de flux String pour être transmise vers d'autres endroits. Le récepteur la convertit ensuite en byte[] puis en image.

1. Si byte[] est transmis directement, une perte de données se produira si byte[] est trop long. Parce que toutes les combinaisons d'octets ne peuvent pas être mappées sur char.

2. Utilisez la spécification d'encodage Base64 commune. La spécification de codage de base64 consiste à convertir les caractères communs en représentation binaire 6 bits (64 sont couramment utilisés, c'est pourquoi on l'appelle base64). Comment écrire, il existe des classes d'outils prêtes à l'emploi comme suit :

import org.apache.commons.codec.binary.Base64;  
public class UtilHelper {     
    //base64字符串转byte[]  
    public static byte[] base64String2ByteFun(String base64Str){  
        return Base64.decodeBase64(base64Str);  
    }  
    //byte[]转base64  
    public static String byte2Base64StringFun(byte[] b){  
        return Base64.encodeBase64String(b);  
    }  
}

De cette façon, la conversion standard entre byte[] et String peut être garantie.

Articles et tutoriels connexes recommandés : Démarrer avec Java à partir de zéro

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn