210 votes

Java : Pourquoi les noms de jeu de caractères ne sont pas constantes ?

Problèmes de charset sont confus et compliqué par eux-mêmes, mais en plus de cela, il faut se rappeler les noms exacts de votre jeux de caractères. Est-ce ? Ou ? Ou peut-être ? Lorsque vous recherchez internet des exemples de code, vous verrez tout cela. Pourquoi ne pas juste faire les constantes nommées et utiliser ?

158voto

Kevin Bourrillion Points 19677

La réponse simple à la question posée, c'est que le disponible jeu de caractères les chaînes de varier d'une plateforme à une autre.

Cependant, il y en a six qui sont tenus d'être présents, de sorte que les constantes pourrait avoir été faite pour ceux qui il y a longtemps. Je ne sais pas pourquoi ils ne l'étaient pas.

JDK 1.4 a fait une grande chose, en introduisant le jeu de caractères de type. À ce stade, ils n'auraient pas voulu donner de constantes de Chaîne de plus, puisque le but est d'amener tout le monde à l'aide de Charset instances. Alors pourquoi ne pas fournir le six du jeu de caractères standard constantes, alors? J'ai demandé à Martin Buchholz car il lui arrive d'être assis à côté de moi, et il m'a dit il n'y avait pas vraiment particulièrement bonne raison, sauf que à l'époque, les choses étaient encore à moitié cuit-trop peu de JDK Api avait été rajoutée à accepter le jeu de caractères, et de ceux qui l'ont été, le jeu de caractères surcharges généralement effectuée légèrement pire.

Il est triste de constater que c'est seulement dans le JDK 1.6 qu'ils ont finalement fini d'équiper tout avec Charset les surcharges. Et que cette rétro performances situation existe encore (la raison en est incroyablement bizarre et je ne peux pas l'expliquer, mais est lié à la sécurité!).

Longue histoire courte -- il suffit de définir vos propres constantes, ou de l'utilisation de la Goyave de jeux de Caractères de la classe qui Tony le Poney lié à (si cette bibliothèque n'est pas vraiment en fait encore sorti).

Mise à jour: un StandardCharsets de la classe est dans le JDK 7.

102voto

Etienne Neveu Points 7454

Deux ans plus tard et Java 7 StandardCharsets maintenant définit des constantes pour les 6 jeux de caractères standard.

Si vous êtes bloqué sur Java 5/6, vous pouvez utiliser les constantes Charsets de goyave, tel que suggéré par Kevin Bourrillion et Jon Skeet.

29voto

Jon Skeet Points 692016

Je dirais que nous pouvons faire beaucoup mieux que ça... pourquoi ne pas la garantie-à-être-disponible jeux directement accessibles? Charset.UTF8 doit être une référence à l' Charset, et non pas le nom d'une chaîne de caractères. De cette façon, nous n'aurions pas à manipuler UnsupportedEncodingException tous sur la place.

Rappelez-vous, je pense aussi qu' .NET a choisi une meilleure stratégie par défaut UTF-8 partout. Il a ensuite vissé vers le haut, en nommant le "système d'exploitation par défaut" propriété de codage simplement Encoding.Default - ce qui n'est pas la valeur par défaut à l'intérieur .NET lui-même :(

Retour à rodomontades sur Java de jeu de caractères de soutien - pourquoi n'est-il pas un constructeur pour FileWriter/FileReader , qui prend en Charset? Fondamentalement, ceux qui sont presque inutiles les cours en raison de cette restriction - vous presque toujours besoin d'un InputStreamReader autour FileInputStream ou l'équivalent de sortie :(

Infirmière, infirmière - où est mon médicament?

EDIT: Il me semble que cela n'a pas vraiment répondu à la question. La vraie réponse est sans doute soit "personne impliquée pensé" ou "quelqu'un qui pensait que c'était une mauvaise idée." Je suggère fortement que la maison de l'utilitaire de classes fournissant les noms ou les jeux de caractères d'éviter la duplication autour de la base de code... Ou vous pouvez simplement utiliser celui que nous utilisons à Google.

27voto

Roger Points 1187

En Java 1.7

import java.nio.charset.StandardCharsets

ex: StandardCharsets.UTF_8 StandardCharsets.US_ASCII

5voto

McDowell Points 62645

L'état actuel de l'encodage de l'API laisse quelque peu à désirer. Certaines parties de la version 6 de Java API de ne pas les accepter, Charset à la place d'une chaîne de caractères (en logging, dom.ls, PrintStream; il y a peut être d'autres). Cela n'aide pas que les encodages sont censés avoir différents noms canoniques pour les différentes parties de la bibliothèque standard.

Je peux comprendre la façon dont les choses arrivés là où ils sont; pas sûr que j'ai des idées brillantes sur la façon de les corriger.


En aparté...

Vous pouvez rechercher les noms de Sun Java 6 mise en œuvre ici.

Pour l'UTF-8, les canonique valeurs sont "UTF-8" pour java.nio et "UTF8" pour java.lang et java.io. La seule codages de la spécification exige un JRE afin d'appui sont les suivants: US-ASCII, ISO-8859-1; format UTF-8 ET UTF-16BE; UTF-16LE; UTF-16.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X