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

114

Cela a probablement été répondu ailleurs mais comment obtenir la valeur de caractère d'une valeur int?

Plus précisément, je lis un à partir d'un flux tcp et la méthode des lecteurs .read () renvoie un int.

Comment en tirer un caractère?

Omar Kooheji
la source
1
Vous n'avez pas précisé les données que vous envoyez et lisez. Envoyez-vous des octets binaires ou des caractères Unicode? La méthode .read () des lecteurs renvoie un entier. Oui, mais il renvoie le caractère lu, sous la forme d'un entier compris entre 0 et 65535 (ou -1, c'est parce que je pense que int est utilisé à la place de char). Peut-être que le simple fait d'utiliser public int read(char[] cbuf)résoudra le problème?
Vanuan
Les réponses à cette question ne fonctionnent pas pour JSP Java. Si vous utilisez des jsp, consultez ce bogue de débordement de pile: stackoverflow.com/questions/4621836
...
Je pense que c'est une question valable. L'une des difficultés de la conversion d'un entier en caractère est de traiter des valeurs négatives et des valeurs> = 255.
bvdb
Que faire si je veux convertir un octet qui se trouve dans un tableau d'octets en caractère, puis l'imprimer sur la console?
Doug Hauf

Réponses:

74

Si vous essayez de convertir un flux en texte, vous devez savoir quel encodage vous souhaitez utiliser. Vous pouvez ensuite passer un tableau d'octets dans le Stringconstructeur et fournir un Charset, ou utiliser InputStreamReaderà la Charsetplace le tableau approprié .

Le simple cast de intvers charne fonctionne que si vous voulez ISO-8859-1, si vous lisez directement des octets à partir d'un flux.

EDIT: Si vous êtes utilisez déjà Reader, puis la coulée de la valeur de retour de read()à charest la bonne façon de procéder (après avoir vérifié que ce soit -1 ou non) ... mais il est généralement plus efficace et pratique pour appeler read(char[], int, int)à lire un bloc entier de texte à la fois. N'oubliez pas de vérifier la valeur de retour pour voir combien de caractères ont été lus.

Jon Skeet
la source
2
Je pense que ce n'est pas ce que le PO demande. Il utilise la méthode de lecture de Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () La question qu'il se pose est de savoir comment convertir la valeur retournée par cette méthode en char .
Vanuan
3
S'il utilise vraiment Reader, cela fait certainement une différence. Ce n'est pas clair, étant donné qu'il parle d'un flux et d'un lecteur (avec un r minuscule) dans la même phrase: (J'ai modifié ma réponse pour que cela soit clair.
Jon Skeet
vous pouvez également envelopper le InputStreamReaderdans un BufferedReader, comme mentionné dans le javadoc docs.oracle.com/javase/8/docs/api/java/io/…
bvdb
Pourquoi est-ce que "Le simple cast de int vers char ne fonctionne que si vous voulez ISO-8859-1"? Est-ce parce que Java utilise UTF-16 en interne et que tous les caractères ISO-8859-1 conservent la même unité de code (bits) en UTF-16?
Sébastien
@Sebastien: Oui, c'est fondamentalement ça.
Jon Skeet
144

Peut-être que vous demandez:

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

Plus d'informations: 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 (Basic Multilingual Plane ou Plane 0), le tableau de caractères résultant 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 a la paire de substitution correspondante.

ATorras
la source
9
Ce n'est valable que si l'entier en question est déjà un point de code UTF-16. Nous ne savons pas si c'est le cas.
Jon Skeet
2
@Atec: Non, ce que je veux dire, c'est que s'il ne fait que lire des octets à partir d'un flux (ce n'est pas clair), la conversion par simple diffusion ou utilisation toCharsest généralement inappropriée. S'il lit à partir d'un lecteur, c'est bien.
Jon Skeet
2
Bien que la question ne l'ait certes pas spécifiée, cette question apparaît comme le premier résultat d'une recherche Google pour la conversion de points de code ASCII en caractères, donc je vote à la hausse.
ArtOfWarfare
105

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

Si vous souhaitez simplement convertir la valeur en int, vous pouvez la convertir en utilisant la notation de conversion de type Java:

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

Si vous voulez dire transformer l'entier 1 en caractère '1', vous pouvez le faire comme ceci:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
Lovubuntu
la source
Et si vous alliez de Char à Integer? Integer.parseInt (c)?
Breedly
Cette réponse est LA seule :-)
voghDev
29

Si vous voulez simplement convertir int 5 en char '5': (Uniquement pour les entiers 0-9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
Ryan Anderson
la source
Non .. '0' + 5 devient la chaîne '05'. Le côté droit doit être (char) ((int) '0') + i;
toddkaufmann
Ce n'est pas vrai car les caractères ne sont pas convertis en chaînes en Java.
Kaushik Shankar
+1 - essayé et testé, ça marche! Essayez et testez-le vous-même, apparemment contrairement aux commentateurs ici ...
Ian Campbell
8

Coulée simple:

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

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

Yuval Adam
la source
1
Conseil dangereux, si le flux de texte n'est pas pur ASCII. Voir la réponse de Jon Skeet ci-dessus.
sleske
1
Cela pourrait ne pas fonctionner. Mais je pense que ce serait en fait. Le type de données char stocke la valeur codée UTF-16. Donc, pour convertir char en int, vous devez effectuer quelques transformations. Mais comme l'OP utilise la méthode read () qui retourne déjà une valeur codée UTF-16, un casting simple fonctionnerait, je pense. Corrigez-moi si je me trompe.
Vanuan
Désolé, je voulais dire "de int à char"
Vanuan
cela entraînera des valeurs de codage inattendues, pas des nombres
Vasil Valchev
4

Cette solution fonctionne pour Taille de longueur entière = 1.

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

si taille> 1, nous devons utiliser for loop et parcourir.

Spiker
la source
1

La plupart des réponses proposées ici proposent des raccourcis, ce qui peut 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 dans quel encodage se trouvent vos données.

UTF-16

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

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

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

Le fait est que chacun readChar()exécutera des 2 readet les combinera en un caractère 16 bits.

US-ASCII

US-ASCII réserve 8 bits pour encoder 1 caractère. Le tableau 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

UTF-8, Latin-1, ANSI et de nombreux autres encodages utilisent tous les 8 bits. Les 7 premiers bits suivent la table ASCII et sont identiques à ceux du codage US-ASCII. Cependant, le 8ème bit propose des caractères différents dans tous ces encodages. Alors, 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 (c'est-à-dire que vous ne vous souciez pas des personnages comme "à, é, ç, è, ô ...) alors vous pouvez vous en tirer avec un casting simple.

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

Toujours utiliser des 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 à l'aide d'un byte[]tampon et convertissez-les en un à l' String aide d'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 InputStreamReaderqui peut être instancié avec un paramètre charset.

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

bvdb
la source
1

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

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

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

char[] c = String.valueOf(i).toCharArray();
src3369
la source
1
    int i = 7;
    char number = Integer.toString(i).charAt(0);
    System.out.println(number);
Shwarz Andrei
la source
0

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


la source
c'est une "réponse" inutile, je voterais contre mais ça n'en vaut même pas la peine.
Lpc_dark
@Lpc_dark Cette réponse est plus correcte que 90% des autres réponses. Voir ma réponse pour plus de détails.
bvdb
0

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); 
Invité89898989
la source
-2

La réponse pour la conversion de char en int ou long est la conversion simple.

Par exemple: - si vous souhaitez convertir Char '0' en long.

Suivez un casting simple

Char ch='0';
String convertedChar= Character.toString(ch);  //Convert Char to String.
Long finalLongValue=Long.parseLong(convertedChar);

Terminé!!

Dheeraj Varne
la source
c'est exactement le contraire de ce qu'il demandait.
specializt