web-dev-qa-db-fra.com

Conversion de flux d'int en caractères dans java

Cela a probablement déjà été répondu ailleurs mais comment obtenez-vous la valeur de caractère d'une valeur int?

Plus précisément, je lis un flux TCP et la méthode .read () du lecteur renvoie un int.

Comment puis-je obtenir un caractère de cela?

114
Omar Kooheji

Si vous essayez de convertir un flux en texte, vous devez savoir quel codage vous souhaitez utiliser. Vous pouvez ensuite soit passer un tableau d'octets dans le constructeur String et fournir un Charset , soit utiliser InputStreamReader avec le Charset approprié.

Transmettre simplement int à char ne fonctionne que si vous voulez ISO-8859-1, si vous lisez directement des octets à partir d'un flux.

EDIT: Si vous utilisez déjà un Reader, alors convertir la valeur de retour de read() en char est le bon choix (après avoir vérifié si c'est -1 ou non ) ... mais il est normalement plus efficace et pratique d’appeler read(char[], int, int) pour lire un bloc de texte entier à la fois. N'oubliez pas de vérifier la valeur de retour pour voir combien de caractères ont été lus.

74
Jon Skeet

Peut-être que vous demandez:

Character.toChars(65) // returns ['A']

Plus d'infos: Character.toChars(int codePoint)

Convertit le caractère spécifié (point de code Unicode) en sa représentation UTF-16 stockée dans un tableau de caractères. Si le point de code spécifié est une valeur BMP (plan multilingue de base ou plan 0), le tableau de caractères obtenu a la même valeur que codePoint. Si le point de code spécifié est un point de code supplémentaire, le tableau de caractères résultant contient la paire de substitution correspondante.

144
ATorras

Cela dépend de ce que vous entendez par "convertir un int en caractère".

Si vous voulez simplement transtyper la valeur dans le int, vous pouvez le lancer en utilisant la notation typecast de Java:

int i = 97; // 97 is 'a' in ASCII
char c = (char) i; // c is now 'a'

Si vous voulez transformer le nombre entier 1 en caractère '1', procédez comme suit:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
105
Lovubuntu

Si vous voulez simplement convertir int 5 en caractère '5': (Seulement pour les entiers de 0 à 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
29
Ryan Anderson

Coulée simple:

int a = 99;
char c = (char) a;

Y a-t-il une raison pour que cela ne fonctionne pas pour vous?

8
Yuval Adam

Cette solution fonctionne pour une longueur de nombre entier = 1.

Integer input = 9; Character.valueOf((char) input.toString().charAt(0))

si taille> 1, nous devons utiliser boucle et itérer.

4
Spiker

La plupart des réponses proposées ici proposent des raccourcis qui peuvent vous poser de gros problèmes si vous n’avez aucune idée de ce que vous faites. Si vous souhaitez utiliser des raccourcis, vous devez savoir exactement en quel encodage vos données sont stockées.

UTF-16

Chaque fois que Java parle de caractères dans sa documentation, il parle de caractères 16 bits.

Vous pouvez utiliser un DataInputStream, qui possède des méthodes pratiques. Pour plus d'efficacité, enveloppez-le dans un BufferedReader.

// e.g. for sockets
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
char character = readChar(); // no need to cast

Le fait est que chaque readChar() effectuera en réalité 2 read et les combinera en un caractère de 16 bits.

US-ASCII

US-ASCII réserve 8 bits pour coder 1 caractère. La table ASCII ne décrit que 128 caractères possibles, donc 1 bit est toujours inutilisé.

Vous pouvez simplement effectuer un casting dans ce cas.

int input = stream.read();
if (input < 0) throw new EOFException();
char character = (char) input;

ASCII étendu

Les codages UTF-8, Latin-1, ANSI et de nombreux autres utilisent tous les 8 bits. Les premiers 7 bits suivent la table ASCII et sont identiques à ceux du codage US-ASCII. Cependant, le 8ème bit offre des caractères différents dans tous ces codages. Donc, ici, les choses deviennent intéressantes.

Si vous êtes un cow-boy et que vous pensez que le 8ème bit n'a pas d'importance (par exemple, vous ne vous souciez pas des personnages comme "à, é, ç, è, ô ...), alors vous pouvez vous en sortir. un casting simple.

Cependant, si vous souhaitez le faire de manière professionnelle, vous devez spécifier TOUJOURS un jeu de caractères à chaque fois que vous importez/exportez du texte (par exemple, des sockets, des fichiers, etc.).

Toujours utiliser les jeux de caractères

Soyons sérieux. Toutes les options ci-dessus sont des astuces bon marché. Si vous souhaitez écrire un logiciel flexible, vous devez prendre en charge un jeu de caractères configurable pour importer/exporter vos données. Voici une solution générique:

Lisez vos données en utilisant un tampon byte[] et convertissez-les en un Stringen utilisant un paramètre charset.

byte[] buffer = new byte[1024];
int nrOfBytes = stream.read(buffer);
String result = new String(buffer, nrOfBytes, charset);

Vous pouvez également utiliser un InputStreamReader pouvant être instancié avec un paramètre charset.

Encore une règle d'or: ne jamais directement attribuer d'octet à un personnage. C'est toujours une erreur.

1
bvdb
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);
1
Shwarz Andrei

Fondant ma réponse sur l'hypothèse que l'utilisateur voulait simplement convertir littéralement un int en char, par exemple

Input: 
int i = 5; 
Output:
char c = '5'

Cela a déjà été répondu ci-dessus, cependant si la valeur entière i > 10, alors il faut utiliser char array.

char[] c = String.valueOf(i).toCharArray();
1
src3369

Cela dépend entièrement du codage des données entrantes.

0
carej

peut-être pas le plus rapide:

//for example there is an integer with the value of 5:
int i = 5;

//getting the char '5' out of it:
char c = String.format("%s",i).charAt(0); 
0
Guest89898989