Warum charset Namen nicht-Konstanten?
Charset-Probleme sind unübersichtlich und kompliziert, die Sie selbst, aber Sie haben zu erinnern, den genauen Namen der Zeichensätze. Ist es "utf8"
? Oder "utf-8"
? Oder vielleicht "UTF-8"
? Bei der Suche internet für code-Beispiele sehen Sie oben. Warum nicht nur machen Sie benannte Konstanten und verwenden Charset.UTF8
?
- +1: Das war ebenfalls nervt mich die ganze Zeit. Das gleiche Geschichte geht weiter, für
MessageDigest#getInstance()
durch die Art und Weise. - Für die richtige Antwort, die Sie brauchen würde, jemanden zu bitten, an der Sonne. Viel Glück damit 🙂
- Stephen C: ich glaube, es wurde diskutiert, auf einer öffentlichen mailing-Liste. -Jemand, der bei Sun.
- siehe diese Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die einfache Antwort auf die Frage, die gestellt ist, dass der verfügbare Zeichensatz Zeichenfolgen variieren von Plattform zu Plattform.
Aber, es gibt sechs, die erforderlich sind, anwesend zu sein, also Konstanten gemacht werden könnten für diejenigen, die vor langer Zeit. Ich weiß nicht, warum Sie das nicht waren.
JDK 1.4 eine große Tat durch die Einführung der Charset-Typ. An diesem Punkt, würden Sie nicht haben wollte-String-Konstanten mehr, da das Ziel ist, dass jeder mit Charset-Instanzen. Warum also nicht die sechs standard-Zeichensatz Konstanten, dann? Ich fragte Martin Buchholz, seit er passiert zu sein, sitzt rechts neben mir, und er sagte, es war nicht wirklich besonders großen Grund, außer, dass zu der Zeit waren die Dinge noch unausgegoren-zu einigen JDK-APIs hatte, das nachträglich zu akzeptieren, Charset, und die, die waren, die Charset-überladungen in der Regel durchgeführt geringfügig schlechter.
Es ist traurig, dass es nur im JDK 1.6, dass Sie endlich fertig, die Ausstattung alles, was mit Charset überlastungen. Und dass diese rückwärts performance-situation noch besteht (der Grund, warum, ist unglaublich komisch und ich kann es nicht erklären, aber ist in Bezug auf Sicherheit!).
Lange Geschichte kurz-nur definieren Ihre eigenen Konstanten, oder verwenden Guave ist Zeichensätze Klasse, die Tony das Pony verknüpft (obwohl, die Bibliothek ist nicht wirklich veröffentlicht tatsächlich noch).
Update: eine
StandardCharsets
Klasse ist in JDK 7.String(byte bytes[], int offset, int length, Charset charset)
umgesetzt wird. In der Tat, der performance-hit ist nicht trivial überhaupt bei der Erstellung eines kleinen string aus einem großen byte[].String
oder eineCharset
Instanz. Gibt es noch spezielle Routinen für bestimmte Szenarien, aber Sie werden auch verwendet, wenn einCharset
angegeben wurde (und alle anderen Bedingungen passen).Zwei Jahre später, und Java 7 StandardCharsets nun definiert Konstanten für die 6 standard-Zeichensätze.
Wenn Sie stecken bleiben auf Java 5/6, können Sie mit Guave ist Zeichensätze Konstanten, wie vorgeschlagen von Kevin Bourrillion und Jon Skeet.
Ich würde argumentieren, dass wir tun können, viel besser als das... warum sind nicht die garantierten-zu-sein-verfügbar Zeichensätze direkt zugänglich?
Charset.UTF8
sollte ein Verweis auf dieCharset
ist, nicht der name als string. Auf diese Weise würden wir nicht haben, umUnsupportedEncodingException
alle über dem Platz.Wohlgemerkt, ich denke auch, dass .NETTO wählte eine bessere Strategie, indem Sie standardmäßig auf UTF-8 überall. Es dann vermasselt, indem Sie die "system default" encoding-Eigenschaft einfach
Encoding.Default
- die nicht der Standard innerhalb .NET selber 🙁Zurück zu schimpfen über Java charset-support - warum gibt es keinen Konstruktor für
FileWriter
/FileReader
die eineCharset
? Im Grunde sind diese fast nutzlos Klassen aufgrund dieser Einschränkung - müssen Sie fast immer eineInputStreamReader
um eineFileInputStream
oder das äquivalent für die Ausgabe 🙁Krankenschwester, Krankenschwester - wo ist meine Medizin?
EDIT: mir fällt auf, dass dies nicht wirklich die Frage beantwortet. Die richtige Antwort ist vermutlich entweder "niemand beteiligt daran gedacht" oder "jemand beteiligt dachte, es war eine schlechte Idee." Ich würde stark vermuten, dass in-house-Programm-Klassen bereitstellen, die Namen oder Zeichensätze zur Vermeidung von Doppelarbeit rund um die codebase... Oder Sie konnte einfach die eine, die wir bei Google, wenn diese Antwort wurde zuerst geschrieben. (Beachten Sie, dass ab Java 7, Sie würden nur verwenden,
StandardCharsets
statt.)StandardCharsets
.static final
Feld) nicht zu Klasse be. Es gab nie einen Grund für die Verwendung eines literalen"UTF-8"
in tausend Orte, statt eines kanonischen symbol. Also ist es das Gegenteil, mit einer Methode, denn das würde tatsächlich dazu führen, dass Klasse be, wenn die Methode aufgerufen wird.java.nio.file.Files
einschließlichnewBufferedReader
undnewBufferedWriter
, StandardUTF-8
wenn keineCharset
versorgt wurde (und Methoden unter ein charset-nameString
gar nicht in dieser Klasse).StandardCharsets
wird berührt, dieUTF_16LE
geladen wird. (Das wird zu einer Verlangsamung der RMI-CGI-Brücke.)StandardCharsets
entwickelt wurde. Nachdem alle, es gibt keine Notwendigkeit für unterschiedlicheUTF_16BE
,UTF_16LE
, undUTF_16
Klassen; das ist ein überbleibsel aus der Zeit, wo die Zeichensätze gesucht, wo durch den Bau und auf der Suche nach Klassennamen. Diese Klassen sind veraltet; die eigentliche Arbeit ist getan, die durch Ihre gemeinsame Basisklasse. Es gibt eigentlich keine Notwendigkeit für unterschiedlicheCharset
Implementierung Klassen überhaupt, da die eigentliche Spezialisierung geschieht in der decoder-und encoder-Implementierungen.In Java 1.7
import java.nio.charset.StandardCharsets
ex:
StandardCharsets.UTF_8
StandardCharsets.US_ASCII
Den aktuellen Stand der encoding-API lässt etwas zu wünschen übrig. Einige Teile der Java 6 API nicht akzeptieren
Charset
im Ort, der einen string (inlogging
,dom.ls
,PrintStream
; es mag andere geben). Es hilft nicht, dass die Codierungen sollen verschiedene kanonische Namen für die verschiedenen Teile der standard-Bibliothek.Ich kann verstehen, wie die Dinge so wurden, wie Sie sind; nicht sicher, ob ich irgendwelche Brillanten Ideen über wie Sie zu beheben.
Nebenbei...
Können Sie die Namen für Sun ' s Java 6-Implementierung hier.
Für UTF-8, die kanonischen Werte sind
"UTF-8"
fürjava.nio
und"UTF8"
fürjava.lang
undjava.io
. Die einzigen Codierungen die Skillung erfordert ein JRE zu unterstützen sind: US-ASCII, ISO-8859-1 und UTF-8 sowie UTF-16BE und UTF-16LE und UTF-16.Habe ich vor langer Zeit definiert, die eine utility-Klasse mit UTF_8, ISO_8859_1 und US_ASCII Charset Konstanten.
Auch, einige vor langer Zeit ( 2+ Jahre ) habe ich eine einfache performance-test zwischen
new String( byte[], Charset )
undnew String( byte[], String charset_name )
und entdeckt, dass die letztere Umsetzung ist DEUTLICH schneller. Wenn Sie einen Blick unter die Haube an den Quellcode wirst du sehen, dass Sie in der Tat Folgen ganz anderen Weg.Deshalb habe ich ein utility in der gleichen Klasse
Warum der String( byte[], Charset ) - Konstruktor nicht das gleiche tun, der mich schlägt.
Charset
brauchen nicht registriert zu werden, also die Ausnahme, die passieren kann. IIRC gab es einige Veränderungen in JDK7 es schneller zu machen, für die bekannt-guteCharset
Implementierungen (Beseitigung der zusätzlichen Kopie).