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.
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.
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?
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.
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 ASCIIchar 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);....}
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.
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 socketsDataInputStream in =newDataInputStream(newBufferedInputStream(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)thrownewEOFException();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' Stringaide d'un paramètre charset .
byte[] buffer =newbyte[1024];int nrOfBytes = stream.read(buffer);String result =newString(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.
public int read(char[] cbuf)
résoudra le problème?Réponses:
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
String
constructeur et fournir unCharset
, ou utiliserInputStreamReader
à laCharset
place le tableau approprié .Le simple cast de
int
verschar
ne 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 deread()
àchar
est 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 appelerread(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.la source
InputStreamReader
dans unBufferedReader
, comme mentionné dans le javadoc docs.oracle.com/javase/8/docs/api/java/io/…Peut-être que vous demandez:
Plus d'informations:
Character.toChars(int codePoint)
la source
toChars
est généralement inappropriée. S'il lit à partir d'un lecteur, c'est bien.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:
Si vous voulez dire transformer l'entier 1 en caractère '1', vous pouvez le faire comme ceci:
la source
Si vous voulez simplement convertir int 5 en char '5': (Uniquement pour les entiers 0-9)
la source
Coulée simple:
Y a-t-il une raison pour laquelle cela ne fonctionne pas pour vous?
la source
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.
la source
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 fichierBufferedReader
.Le fait est que chacun
readChar()
exécutera des 2read
et 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.
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 .Vous pouvez également utiliser un
InputStreamReader
qui 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.
la source
Baser ma réponse sur l'hypothèse que l'utilisateur voulait simplement convertir littéralement un
int
enchar
, par exempleCela a déjà été répondu ci-dessus, mais si la valeur entière
i > 10
, alors besoin d'utiliserchar array
.la source
la source
Cela dépend entièrement du codage des données entrantes.
la source
peut-être pas le plus rapide:
la source
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
Terminé!!
la source