2009-03-30 7 views
22

Je dois convertir un caractère en un tableau d'octets ou un tableau d'octets. Dans d'autres langues, je sais qu'un caractère n'est qu'un seul octet. Cependant, en regardant la classe Java Character, sa valeur min est \ u0000 et sa valeur max est \ uFFFF. Cela donne l'impression qu'un char a 2 octets de long. Est-ce que je serai capable de le stocker comme octet ou ai-je besoin de le stocker comme deux octets? Avant que quelqu'un ne le demande, je dirai que j'essaye de le faire parce que je travaille sous une interface qui s'attend à ce que mes résultats soient un tableau d'octets. Je dois donc convertir mon omble en un.Représentation de char comme octet en Java

S'il vous plaît laissez-moi savoir et m'aider à comprendre cela.

Merci, JBU

Répondre

34

Pour convertir les caractères en octets, vous devez spécifier un character encoding. Certains encodages de caractères utilisent un octet par caractère, tandis que d'autres utilisent deux octets ou plus. En fait, pour de nombreuses langues, il y a beaucoup trop de caractères à encoder avec un seul octet.

En Java, la méthode la plus simple pour convertir des caractères en octets consiste à utiliser la méthode getBytes(String encoding) de la classe String. Toutefois, cette méthode remplace silencieusement les caractères avec & # xfffd; si le caractère ne peut pas être mappé sous le codage spécifié. Si vous avez besoin de plus de contrôle, vous pouvez configurer un CharsetEncoder pour gérer ce cas avec une erreur ou utiliser un autre caractère de remplacement.

+1

utiliserait UTF-8 et stocker mes caractères comme un seul octet serait ok? Je pense oui, même si ce dernier bit était un signe pour un octet. – jbu

+0

Vous devez utiliser le codage de caractères requis par l'interface sous laquelle vous travaillez. – erickson

+1

Pour les codages mono-octets, utilisez la famille ISO-8859 –

0

char in java est une valeur de 16 bits non signée. Si ce que vous avez va tenir dans 7 bits, il suffit de faire le cast à un octet (par exemple ASCII s'adaptera).

Vous pouvez aussi consulter les API java.nio.charset.

+0

Il doit s'adapter en 7 bits pour travailler en toute sécurité. – erickson

+0

oui, je ne voulais pas entrer dans ASCII étendu ... mais je vais mettre à jour ma réponse. – TofuBeer

4

Pour prolonger ce que disent les autres, si vous avez char que vous avez besoin en tant que tableau d'octets, alors vous créez une chaîne contenant ce omble chevalier et obtenir le tableau d'octets de la chaîne:

private byte[] charToBytes(final char x) { 
    String temp = new String(new char[] {x}); 
    try { 
    return temp.getBytes("ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
    // Log a complaint 
    return null; 
    } 
} 

Bien sûr, utilisez le jeu de caractères approprié. Beaucoup plus efficace que ce serait de commencer à travailler avec des chaînes plutôt que de prendre un char à la fois, convertir en chaîne, puis convertir en un tableau d'octets.

8

Un caractère est en effet 16 bits en Java (et c'est aussi le seul type non signé !!). Si vous êtes sûr que l'encodage de vos caractères est ASCII, vous pouvez simplement les rejeter sur un octet (puisque ASCII utilise seulement les 7 bits inférieurs du caractère).

Si vous n'avez pas besoin de modifier les caractères, ou comprendre leur signification dans une chaîne, vous pouvez simplement stocker les caractères sur deux octets, comme:

char[] c = ...; 
byte[] b = new byte[c.length*2]; 
for(int i=0; i<c.length; i++) { 
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
} 

(Il est conseillé de remplacer le 2 * par un décalage de droite, si la vitesse compte). Notez cependant que certains caractères réels (affichés) (ou, plus précisément, les points de code Unicode) sont écrits sur deux caractères consécutifs. Donc, couper entre deux caractères ne garantit pas que vous coupez entre les caractères réels.

Si vous avez besoin de décoder/encoder ou de manipuler votre tableau de caractères d'une manière compatible avec les chaînes de caractères, vous devriez plutôt essayer de décoder et d'encoder votre tableau ou chaîne de caractères en utilisant java.io outils, qui assurent la manipulation des caractères appropriés.

+0

Plutôt que le code affiché ici, spécifiez "UTF-16" comme codage de caractères et utilisez des API de codage intégrées. Moins de code à implémenter, tester et maintenir, et capture l'intention plus clairement pour les lecteurs du code. – erickson

+0

Et aussi deux ordres de grandeur moins en vitesse, en raison de l'encodage/décodage, qui peut ne pas être nécessaire dans ce cas. – Varkhan

+0

C'est seulement l'encodage, et si c'est plus lent (ce dont je doute), ce n'est pas un facteur de 100. Pourquoi pensez-vous que l'encodage UTF-16 fait quelque chose de significativement différent de votre code? – erickson

Questions connexes