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

yegor256
la source
11
Voir cette question .
hautement caféiné
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

Roger
la source
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 .

yegor256
la source
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.

Daniel Pryden
la source
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.

cosjav
la source
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.

Alfredo Carrillo
la source
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

tskuzzy
la source
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.

paulsm4
la source
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);
Mostafa Vatanpour
la source
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
JJD
la source
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;
Vazgen Torosyan
la source
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.
sendon1982
la source