578 Stimmen

Wo erhält man ein "UTF-8"-String-Literal in Java?

Ich versuche, eine Konstante anstelle eines String-Literal in diesem Stück Code zu verwenden:

new InputStreamReader(new FileInputStream(file), "UTF-8")

"UTF-8" kommt im Code recht häufig vor und sollte besser auf eine static final stattdessen eine Variable. Wissen Sie, wo ich eine solche Variable im JDK finden kann?

Übrigens, wenn ich es mir recht überlege, sind solche Konstanten schlecht konzipiert: Öffentliche statische Literale ... sind keine Lösung für Datenduplikation

11 Stimmen

Véase diese Frage .

2 Stimmen

Hinweis: Wenn Sie bereits mit Java 7 arbeiten, verwenden Sie Files.newBufferedWriter(Path path, Charset cs) von NIO.

3 Stimmen

Das ist ein wirklich schlechter Ratschlag in Ihrem Link. Er will, dass Sie eine Wrapper-Klasse für jede mögliche String-Konstante machen, die Sie verwenden könnten?

985voto

Roger Punkte 10521

In Java 1.7+, java.nio.charset.StandardCharsets definiert Konstanten für Charset einschließlich UTF_8 .

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Für Android: minSdk 19

3 Stimmen

Verwenden Sie .toString() dafür?

57 Stimmen

.toString() wird funktionieren, aber die richtige Funktion ist .name() . 99,9 % toString ist nicht die Antwort.

1 Stimmen

Übrigens .displayName() funktioniert ebenfalls, es sei denn, es wird wie vorgesehen für die Lokalisierung überschrieben.

147voto

yegor256 Punkte 96888

Jetzt benutze ich org.apache.commons.lang3.CharEncoding.UTF_8 Konstante aus commons-lang .

5 Stimmen

Für diejenigen, die Lang 3.0 verwenden: org.apache.commons.lang3.CharEncoding.UTF_8 . (Anmerkung: "lang3").

26 Stimmen

Wenn Sie Java 1.7 verwenden, lesen Sie die Antwort von @Roger unten, da es Teil der Standardbibliothek ist.

5 Stimmen

P.S. "@Rogers Antwort unten" ist jetzt @Rogers Antwort über .

73voto

Daniel Pryden Punkte 56882

El Google Guava Bibliothek (die ich ohnehin sehr empfehlen würde, wenn Sie in Java arbeiten) hat eine Charsets Klasse mit statischen Feldern wie Charsets.UTF_8 , Charsets.UTF_16 , usw.

Seit Java 7 sollten Sie einfach die java.nio.charset.StandardCharsets stattdessen für vergleichbare Konstanten.

Beachten Sie, dass diese Konstanten keine Zeichenketten sind, sondern tatsächliche Charset Instanzen. Alle Standard-APIs, die einen Zeichensatznamen annehmen, haben auch eine Überladung, die einen Charset Objekt, das Sie stattdessen verwenden sollten.

3 Stimmen

Sollte also Charsets.UTF_8.name() lauten?

1 Stimmen

@kilaka Ja, verwenden Sie name() anstelle von getDisplayName(), da name() endgültig ist und getDisplayName() nicht

0 Stimmen

Es ist keine gute Idee, Code von Drittanbietern zu verwenden, der ständig geändert wird und die Abwärtskompatibilität aufhebt, um etwas zu erreichen, was man mit dem Standard-SDK tun kann.

51voto

cosjav Punkte 2075

Für den Fall, dass diese Seite in der Websuche auftaucht, können Sie ab Java 1.7 jetzt java.nio.charset.StandardCharsets um Zugang zu konstanten Definitionen von Standardzeichensätzen zu erhalten.

0 Stimmen

Ich habe versucht, dies zu verwenden, aber es scheint nicht zu funktionieren. Charset.defaultCharset());" scheint zu funktionieren, nachdem ich "java.nio.charset.*" eingefügt habe, aber ich kann anscheinend nicht explizit auf UTF8 verweisen, wenn ich versuche, "File.readAllLines" zu verwenden.

1 Stimmen

@Roger Wo liegt das Problem? Soweit ich sehen kann, können Sie einfach anrufen: Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);

0 Stimmen

Ich weiß nicht, was das Problem war, aber bei mir funktionierte es, nachdem ich etwas geändert hatte, an das ich mich nicht mehr erinnern kann.

10voto

Alfredo Carrillo Punkte 306

Diese Konstante ist verfügbar (u.a. als: UTF-16 , US-ASCII , etc.) in der Klasse org.apache.commons.codec.CharEncoding auch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X