Où trouver le littéral de chaîne «UTF-8» en Java?


490

J'essaie d'utiliser une constante au lieu d'un littéral de chaîne dans ce morceau de code:

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

"UTF-8"apparaît dans le code assez souvent, et il serait préférable de se référer à une static finalvariable à la place. Savez-vous où je peux trouver une telle variable dans JDK?

BTW, après réflexion, ces constantes sont de mauvaise conception: les littéraux statiques publics ... ne sont pas une solution pour la duplication des données



1
Remarque: si vous êtes déjà sur Java 7, utilisez Files.newBufferedWriter(Path path, Charset cs)depuis NIO.
Franklin Yu

Réponses:


836

Dans Java 1.7+, java.nio.charset.StandardCharsets définit les constantes à Charsetinclure UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Pour Android: minSdk 19


3
utilisez-vous .toString () à ce sujet?
Matt Broekhuis du

54
.toString()fonctionnera mais la fonction appropriée est .name(). 99,9% toString n'est pas la réponse.
Roger

1
btw .displayName()fonctionnera également à moins qu'il ne soit remplacé pour la localisation comme prévu.
Roger

36
Vous n'avez pas vraiment besoin d'appeler name()du tout. Vous pouvez directement passer l' Charsetobjet dans le InputStreamReaderconstructeur.
Natix

6
Et il existe d'autres bibliothèques qui nécessitent un String, peut-être pour des raisons héritées. Dans de tels cas, je garde un Charsetobjet autour, généralement dérivé de StandardCharsets, et utilise name()si nécessaire.
Magnilex

134

Maintenant, j'utilise org.apache.commons.lang3.CharEncoding.UTF_8constante de commons-lang .


4
Pour ceux qui utilisent Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Notez "lang3").
Russell Silva

24
Si vous utilisez Java 1.7, consultez la réponse de @ Roger ci-dessous car elle fait partie de la bibliothèque standard.
Drew Stephens

2
PS "La réponse de @ Roger ci-dessous" est maintenant la réponse de @ Roger ci-dessus . ☝
Gary S.

Cette classe est obsolète depuis que Java 7 introduit java.nio.charset.StandardCharsets
sendon1982

66

La bibliothèque Google Guava (que je recommande fortement de toute façon, si vous travaillez en Java) a une Charsetsclasse avec des champs statiques commeCharsets.UTF_8 , Charsets.UTF_16, etc.

Depuis Java 7, vous devez simplement utiliser à la java.nio.charset.StandardCharsetsplace des constantes comparables.

Notez que ces constantes ne sont pas des chaînes, ce sont des Charsetinstances réelles . Toutes les API standard qui prennent un nom de jeu de caractères ont également une surcharge qui accepte un Charsetobjet que vous devez utiliser à la place.


3
Donc, devrait être Charsets.UTF_8.name ()?
AlikElzin-kilaka

1
@kilaka Ouais, utilisez name () au lieu de getDisplayName () puisque name () est final et getDisplayName () ne l'est pas
RKumsher

3
@Buffalo: Veuillez relire ma réponse: il recommande d'utiliser java.nio.charset.StandardCharsetssi possible, qui n'est pas un code tiers. De plus, les définitions des jeux de caractères de la goyave ne sont pas "constamment modifiées" et AFAIK n'a jamais rompu la compatibilité descendante, donc je ne pense pas que votre critique soit justifiée.
Daniel Pryden

2
@Buffalo: C'est comme cela peut être, mais je doute que vos problèmes aient quelque chose à voir avec la Charsetsclasse. Si vous voulez vous plaindre de la goyave, c'est bien, mais ce n'est pas l'endroit pour ces plaintes.
Daniel Pryden

1
Veuillez ne pas inclure de bibliothèque de plusieurs mégaoctets pour obtenir une constante de chaîne.
Jeffrey Blattman

50

Dans le cas où cette page apparaît dans la recherche Web de quelqu'un, à partir de Java 1.7, vous pouvez maintenant utiliser java.nio.charset.StandardCharsets pour accéder aux définitions constantes des jeux de caractères standard.


J'ai essayé de l'utiliser, mais cela ne semble pas fonctionner. «Charset.defaultCharset ());» semble fonctionner après avoir inclus 'java.nio.charset. *' mais je n'arrive pas à me référer explicitement à UTF8 lorsque j'essaie d'utiliser 'File.readAllLines'.
Roger

1
@Roger Quel semble être le problème? D'après ce que je peux voir, vous pouvez simplement appeler:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

Je ne sais pas quel était le problème, mais cela a fonctionné pour moi après avoir changé quelque chose dont je ne me souviens pas.
Roger

1
^^^ Vous avez probablement dû changer la plate-forme cible dans l'IDE. Si 1.6 était votre dernier JDK lorsque vous avez installé l'IDE, il l'a probablement choisi par défaut et l'a conservé par défaut longtemps après que vous ayez mis à jour l'IDE et le JDK eux-mêmes en place.
Bitbang3r

10

Cette constante est disponible (entre autres que: UTF-16, US-ASCII, etc.) dans la classe org.apache.commons.codec.CharEncodingainsi.


9

Il n'y en a pas (du moins dans la bibliothèque Java standard). Les jeux de caractères varient d'une plateforme à l'autre, il n'y a donc pas de liste standard en Java.

Il existe cependant des bibliothèques tierces qui contiennent ces constantes. L'un d'eux est Guava (bibliothèques principales de Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


Il m'a fallu une seconde pour comprendre ceci ... Les constantes des charsets de Guava sont (sans surprise) des charsets, pas des cordes. InputStreamReader a un autre constructeur qui prend un Charset plutôt qu'une chaîne. Si vous avez vraiment besoin de la chaîne, c'est par exemple Charsets.UTF_8.name ().
Ed Staub

1
Les jeux de caractères peuvent varier d'une plate-forme à l'autre, mais UTF-8 est garanti d'exister.
tar

3
Tous les jeux de caractères définis dans StandardCharsetssont garantis pour exister dans chaque implémentation Java sur chaque plate-forme.
Krzysztof Krasoń

8

Vous pouvez utiliser l' Charset.defaultCharset()API ou la file.encodingpropriété.

Mais si vous voulez votre propre constante, vous devrez la définir vous-même.


11
Le jeu de caractères par défaut est généralement déterminé par les paramètres du système d'exploitation et des paramètres régionaux, je ne pense pas qu'il y ait de garantie qu'il reste le même pour plusieurs appels Java. Ce n'est donc pas un remplacement pour un "utf-8" sepcifiant constant.
Jörn Horstmann

6

Dans Java 1.7+

N'utilisez pas de chaîne "UTF-8", utilisez plutôt le Charsetparamètre type:

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);

4

Si vous utilisez OkHttp pour Java / Android, vous pouvez utiliser la constante suivante:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String

2
il est supprimé d'OkHttp, donc la prochaine étape est: Charset.forName("UTF-8").name()lorsque vous avez besoin d'un support pour Android inférieur à API 19+, sinon vous pouvez utiliser:StandardCharsets.UTF_8.name()
mtrakal

3

Définitions constantes pour la norme. Ces jeux de caractères sont garantis pour être disponibles sur chaque implémentation de la plate-forme Java. depuis 1.7

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;

0

La classe org.apache.commons.lang3.CharEncoding.UTF_8est déconseillée après l'introduction de Java 7java.nio.charset.StandardCharsets

  • @voir JRE encoding character names
  • @since 2.1
  • @deprecated Java 7 a introduit {@link java.nio.charset.StandardCharsets}, qui définit ces constantes comme
  • {@link Charset} objets. Utilisez {@link Charset # name ()} pour obtenir les valeurs de chaîne fournies dans cette classe.
  • Cette classe sera supprimée dans une future version.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.