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.
public int read(char[] cbuf)löst nur die Verwendung das Problem?