¿Dónde obtener el literal de cadena “UTF-8” en Java?

4 minutos de lectura

avatar de usuario
yegor256

Estoy tratando de usar una constante en lugar de un literal de cadena en este código:

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

"UTF-8" aparece en el código con bastante frecuencia, y sería mucho mejor referirse a algunos static final variable en su lugar. ¿Sabes dónde puedo encontrar una variable de este tipo en JDK?

Por cierto, pensándolo bien, tales constantes son un mal diseño: Los literales estáticos públicos… no son una solución para la duplicación de datos

  • Ver esta pregunta.

    – altamente cafeinado

    14 de julio de 2011 a las 18:51

  • Nota: si ya está en Java 7, use Files.newBufferedWriter(Path path, Charset cs) de NIO.

    -Franklin Yu

    8 de agosto de 2018 a las 14:55

  • Ese es un consejo realmente malo de su enlace. ¿Él quiere que hagas una clase contenedora para cada constante de cadena posible que puedas usar?

    – Ariel

    25 de junio de 2020 a las 20:15

avatar de usuario
roger

En Java 1.7+, java.nio.charset.StandardCharsets define constantes para Charset incluido UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Para Android: minSdk 19

  • ¿Usas .toString() en eso?

    – Matt Broekhuis

    22/10/2013 a las 17:30

  • .toString() funcionará, pero la función adecuada es .name(). 99.9% toString no es la respuesta.

    – roger

    19 de febrero de 2014 a las 16:25


  • por cierto .displayName() también funcionará a menos que se anule para la localización según lo previsto.

    – roger

    19 de febrero de 2014 a las 16:35

  • Realmente no necesitas llamar name() en absoluto. Puede pasar directamente el Charset objeto en el InputStreamReader constructor.

    – Natix

    19 de noviembre de 2014 a las 10:33


  • Y hay otras librerías por ahí que requieren un String, tal vez por razones heredadas. En tales casos, mantengo un Charset objeto alrededor, típicamente derivado de StandardCharsetsy use name() si es necesario.

    – Magnilex

    2 de marzo de 2015 a las 14:32

avatar de usuario
yegor256

ahora uso org.apache.commons.lang3.CharEncoding.UTF_8 constante de commons-lang.

  • Para aquellos que usan Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Nota “lang3”).

    – Russell Silva

    17 de junio de 2013 a las 17:38

  • Si está utilizando Java 1.7, consulte la respuesta de @Roger a continuación, ya que es parte de la biblioteca estándar.

    – Drew Stephens

    4 sep 2013 a las 14:54

  • PD “La respuesta de @Roger a continuación” es ahora la respuesta de @Roger arriba. ☝

    – Gary Shepard

    27 de febrero de 2019 a las 12:32

  • Esa clase está en desuso desde que Java 7 introdujo java.nio.charset.StandardCharsets

    – envío1982

    11 de mayo de 2020 a las 3:40

avatar de usuario
daniel priden

los Google guayaba biblioteca (que recomiendo encarecidamente de todos modos, si está trabajando en Java) tiene un Charsets clase con campos estáticos como Charsets.UTF_8, Charsets.UTF_16etc.

Desde Java 7 solo debes usar java.nio.charset.StandardCharsets en cambio para constantes comparables.

Tenga en cuenta que estas constantes no son cadenas, son reales Charset instancias. Todas las API estándar que toman un nombre de juego de caracteres también tienen una sobrecarga que toma un Charset objeto que debe utilizar en su lugar.

  • Entonces, ¿debería ser Charsets.UTF_8.name()?

    – AlikElzin-kilaka

    25 de marzo de 2013 a las 8:31

  • @kilaka Sí, use name() en lugar de getDisplayName() ya que name() es definitivo y getDisplayName() no lo es

    – RKumsher

    27/02/2014 a las 18:40


  • @Buffalo: lea mi respuesta nuevamente: recomienda usar java.nio.charset.StandardCharsets cuando sea posible, que no sea un código de terceros. Además, las definiciones de Guava Charsets no se “modifican constantemente” y AFAIK nunca han roto la compatibilidad con versiones anteriores, por lo que no creo que sus críticas estén justificadas.

    –Daniel Pryden

    13 de noviembre de 2017 a las 16:37

  • @Buffalo: Eso es lo que puede ser, pero dudo que sus problemas tengan algo que ver con el Charsets clase. Si quieres quejarte de Guava, está bien, pero este no es el lugar para esas quejas.

    –Daniel Pryden

    14 de noviembre de 2017 a las 13:16

  • No incluya una biblioteca de varios megabytes para obtener una cadena constante.

    –Jeffrey Blattman

    9 oct 2018 a las 23:06

En caso de que esta página aparezca en la búsqueda web de alguien, a partir de Java 1.7 ahora puede usar java.nio.charset.StandardCharsets para obtener acceso a definiciones constantes de conjuntos de caracteres estándar.

Esta constante está disponible (entre otros como: UTF-16, US-ASCIIetc.) en la clase org.apache.commons.codec.CharEncoding también.

avatar de usuario
tkuzzy

No hay ninguno (al menos en la biblioteca estándar de Java). Los conjuntos de caracteres varían de una plataforma a otra, por lo que no hay una lista estándar de ellos en Java.

Sin embargo, hay algunas bibliotecas de terceros que contienen estas constantes. Uno de estos es Guava (bibliotecas principales de Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html

avatar de usuario
andres tobilko

Puedes usar Charset.defaultCharset() API o file.encoding propiedad.

Pero si quiere su propia constante, deberá definirla usted mismo.

  • El conjunto de caracteres predeterminado generalmente está determinado por el sistema operativo y la configuración regional, no creo que haya ninguna garantía de que siga siendo el mismo para múltiples invocaciones de Java. Así que esto no es un reemplazo para un “utf-8” constante de sepcificación.

    – Jörn Horstmann

    14 de julio de 2011 a las 21:43

¿Ha sido útil esta solución?