Konvertieren von Ints in Chars in Java

114

Dies wurde wahrscheinlich an anderer Stelle beantwortet, aber wie erhält man den Zeichenwert eines int-Werts?

Insbesondere lese ich ein aus einem TCP-Stream und die .read () -Methode des Readers gibt ein int zurück.

Wie bekomme ich einen Char daraus?

Omar Kooheji
quelle
1
Sie haben nicht näher erläutert, welche Daten Sie senden und lesen. Senden Sie Binärbytes oder Unicode-Zeichen? Die Methode reader .read () gibt ein int zurück. Ja, aber es gibt das gelesene Zeichen als Ganzzahl im Bereich von 0 bis 65535 zurück (oder -1, weil ich denke, dass int anstelle von char verwendet wird). Vielleicht public int read(char[] cbuf)löst nur die Verwendung das Problem?
Vanuan
Die Antworten auf diese Frage funktionieren nicht für JSP Java. Wenn Sie JSPs verwenden, sehen Sie diesen Stapelüberlauffehler: stackoverflow.com/questions/4621836/…
NuclearPeon
Ich denke, das ist eine berechtigte Frage. Eine der Schwierigkeiten bei der Konvertierung einer Ganzzahl in ein
Zeichen
Was ist, wenn ich ein Byte in einem Byte-Array in ein Zeichen konvertieren und dann auf der Konsole drucken möchte?
Doug Hauf

Antworten:

74

Wenn Sie versuchen, einen Stream in Text umzuwandeln, müssen Sie wissen, welche Codierung Sie verwenden möchten. Sie können dann entweder ein Array von Bytes an den StringKonstruktor übergeben und ein angeben Charsetoder stattdessen InputStreamReaderdas entsprechende Charsetverwenden.

Das einfache Casting von intto charfunktioniert nur, wenn Sie ISO-8859-1 möchten und wenn Sie Bytes aus einem Stream direkt lesen.

EDIT: Wenn Sie sind bereits mit Reader, dann den Rückgabewert des Gießens read()auf chardie richtige Art und Weise zu gehen (nach der Überprüfung , ob es -1 oder nicht) ... aber es ist normalerweise effizienter und bequemer zu nennen read(char[], int, int)einen ganzen Block von lesen Text zu einem Zeitpunkt. Vergessen Sie jedoch nicht, den Rückgabewert zu überprüfen, um festzustellen, wie viele Zeichen gelesen wurden.

Jon Skeet
quelle
2
Ich denke, das ist nicht das, wonach das OP fragt. Er verwendet die Lesemethode von Reader: java.sun.com/j2se/1.4.2/docs/api/java/io/Reader.html#read () Die Frage, die er stellt, ist, wie der von dieser Methode zurückgegebene Wert in char konvertiert wird .
Vanuan
3
Wenn er Reader wirklich benutzt, macht das sicherlich einen Unterschied. Es ist nicht klar, da er im selben Satz über einen Stream und einen Leser (mit einem Kleinbuchstaben r) spricht :( Ich habe meine Antwort bearbeitet, um dies klar zu machen.
Jon Skeet
Sie können das auch InputStreamReaderin ein BufferedReader
einpacken
Warum funktioniert "Das einfache Umwandeln von int nach char funktioniert nur, wenn Sie ISO-8859-1 möchten"? Liegt es daran, dass Java UTF-16 intern verwendet und alle ISO-8859-1-Zeichen dieselbe Codeeinheit (Bits) in UTF-16 beibehalten?
Sébastien
@Sebastien: Ja, das ist es im Grunde.
Jon Skeet
144

Vielleicht fragen Sie nach:

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

Mehr Info: Character.toChars(int codePoint)

Konvertiert das angegebene Zeichen (Unicode-Codepunkt) in seine UTF-16-Darstellung, die in einem char-Array gespeichert ist. Wenn der angegebene Codepunkt ein BMP-Wert (Basic Multilingual Plane oder Plane 0) ist, hat das resultierende char-Array denselben Wert wie codePoint. Wenn der angegebene Codepunkt ein zusätzlicher Codepunkt ist, hat das resultierende char-Array das entsprechende Ersatzpaar.

ATorras
quelle
9
Dies ist nur gültig, wenn die betreffende Ganzzahl bereits ein UTF-16-Codepunkt ist. Wir haben keine Ahnung, ob das der Fall ist.
Jon Skeet
2
@Atec: Nein, mein Punkt ist, dass wenn er nur Bytes aus einem Stream liest (es ist nicht klar), die Konvertierung durch einfaches Casting oder Verwenden toCharsnormalerweise unangemessen ist. Wenn er von einem Leser liest, ist es in Ordnung.
Jon Skeet
2
Zwar hat die Frage dies nicht angegeben, diese Frage ist jedoch das erste Ergebnis einer Google-Suche zur Konvertierung von ASCII-Codepunkten in Zeichen. Daher stimme ich ihr zu.
ArtOfWarfare
105

Es hängt davon ab, was Sie unter "ein int in char konvertieren" verstehen.

Wenn Sie den Wert einfach in int umwandeln möchten, können Sie ihn mit der Typecast-Notation von Java umwandeln:

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

Wenn Sie die Ganzzahl 1 in das Zeichen '1' umwandeln möchten, können Sie dies folgendermaßen tun:

if (i >= 0 && i <= 9) {
char c = Character.forDigit(i, 10);
....
}
Lovubuntu
quelle
Was wäre, wenn Sie von Char zu Integer wechseln würden? Integer.parseInt (c)?
Breedly
Diese Antwort ist DIE :-)
voghDev
29

Wenn Sie einfach int 5 in char '5' konvertieren möchten: (Nur für ganze Zahlen 0 - 9)

int i = 5;
char c = (char) ('0' + i); // c is now '5';
Ryan Anderson
quelle
Nein .. '0' + 5 wird zur Zeichenfolge '05'. Die rechte Seite sollte (char) ((int) '0') + i sein;
Toddkaufmann
Nicht wahr, da Zeichen in Java nicht in Strings konvertiert werden.
Kaushik Shankar
+1 - bewährt, es funktioniert! Versuchen Sie es selbst zu testen, scheinbar anders als die Kommentatoren hier ...
Ian Campbell
8

Einfaches Casting:

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

Gibt es einen Grund, warum dies bei Ihnen nicht funktioniert?

Yuval Adam
quelle
1
Gefährlicher Rat, wenn der Textstrom nicht reines ASCII ist. Siehe Jon Skeets Antwort oben.
Sleske
1
Es könnte nicht funktionieren. Aber ich denke es würde tatsächlich. Der char-Datentyp speichert den UTF-16-codierten Wert. Um char auf int zu setzen, müssen Sie einige Transformationen durchführen. Aber da das OP die read () -Methode verwendet, die bereits einen UTF-16-codierten Wert zurückgibt, würde ein einfaches Casting meiner Meinung nach funktionieren. Korrigieren Sie mich, wenn ich falsch liege.
Vanuan
Entschuldigung, ich meinte "von int zu char"
Vanuan
Dies wird unerwartete Codierungswerte verursachen, keine Zahlen
Vasil Valchev
4

Diese Lösung funktioniert für Integer-Längengröße = 1.

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

Wenn Größe> 1, müssen wir for-Schleife verwenden und durchlaufen.

Spiker
quelle
1

Die meisten Antworten hier schlagen Verknüpfungen vor, die Ihnen große Probleme bereiten können, wenn Sie keine Ahnung haben, was Sie tun. Wenn Sie Verknüpfungen verwenden möchten, müssen Sie genau wissen, in welcher Codierung Ihre Daten enthalten sind.

UTF-16

Immer wenn Java in seiner Dokumentation über Zeichen spricht, spricht es über 16-Bit-Zeichen.

Sie können eine verwenden DataInputStream, die bequeme Methoden hat. Wickeln Sie es aus Effizienzgründen in a BufferedReader.

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

Die Sache ist, dass jeder readChar()tatsächlich 2 read's ausführt und sie zu einem 16-Bit-Zeichen kombiniert.

US-ASCII

US-ASCII reserviert 8 Bits, um 1 Zeichen zu codieren. Die ASCII-Tabelle beschreibt jedoch nur 128 mögliche Zeichen, sodass 1 Bit immer nicht verwendet wird.

In diesem Fall können Sie einfach eine Besetzung durchführen.

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

Erweitertes ASCII

UTF-8, Latin-1, ANSI und viele andere Codierungen verwenden alle 8-Bit. Die ersten 7-Bit folgen der ASCII-Tabelle und sind identisch mit denen der US-ASCII-Codierung. Das 8. Bit bietet jedoch Zeichen, die sich in all diesen Codierungen unterscheiden. Hier wird es also interessant.

Wenn Sie ein Cowboy sind und denken, dass das 8. Bit keine Rolle spielt (dh Sie interessieren sich nicht für Charaktere wie "à, é, ç, è, ô ...), können Sie mit einer einfachen Besetzung davonkommen.

Wenn Sie dies jedoch professionell tun möchten, sollten Sie IMMER einen Zeichensatz angeben, wenn Sie Text importieren / exportieren (z. B. Sockets, Dateien ...).

Verwenden Sie immer Zeichensätze

Lass uns ernst werden. Alle oben genannten Optionen sind billige Tricks. Wenn Sie flexible Software schreiben möchten, müssen Sie einen konfigurierbaren Zeichensatz zum Importieren / Exportieren Ihrer Daten unterstützen. Hier ist eine generische Lösung:

Lesen Sie Ihre Daten mit einem byte[]Puffer und konvertieren Sie diese String mithilfe eines Zeichensatzparameters in einen .

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

Sie können auch eine verwenden, InputStreamReaderdie mit einem Zeichensatzparameter instanziiert werden kann.

Nur noch eine goldene Regel: Wirf niemals ein Byte direkt auf einen Charakter. Das ist immer ein Fehler.

bvdb
quelle
1

Gründend meine Antwort auf der Annahme , dass der Benutzer wollte nur literaaly eine konvertieren intzu char, zum Beispiel

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

Dies wurde bereits oben beantwortet, wenn jedoch der ganzzahlige Wert i > 10verwendet werden muss char array.

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

Dies hängt vollständig von der Codierung der eingehenden Daten ab.


quelle
Dies ist wie eine nutzlose "Antwort", ich würde abstimmen, aber es ist es nicht einmal wert.
Lpc_dark
@Lpc_dark Diese Antwort ist korrekter als 90% der anderen Antworten. Siehe meine Antwort für weitere Details.
Bvdb
0

vielleicht nicht der schnellste:

//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); 
Guest89898989
quelle
-2

Die Antwort für die Konvertierung von char in int oder long ist einfaches Casting.

Zum Beispiel: - Wenn Sie Char '0' in long umwandeln möchten.

Folgen Sie der einfachen Besetzung

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

Getan!!

Dheeraj Varne
quelle
das ist genau das Gegenteil von dem, was er gefragt hat.
Spezialisiert