Onde obter a string "UTF-8" literal em Java?

490

Estou tentando usar uma constante em vez de uma string literal neste pedaço de código:

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

"UTF-8"aparece no código com bastante frequência e seria muito melhor se referir a alguma static finalvariável. Você sabe onde posso encontrar essa variável no JDK?

BTW, pensando bem, essas constantes são de design ruim: literais estáticos públicos ... não são uma solução para duplicação de dados

yegor256
fonte
11
Veja esta pergunta .
highlycaffeinated
1
Nota: se você já estiver no Java 7, use Files.newBufferedWriter(Path path, Charset cs)do NIO.
Franklin Yu

Respostas:

836

No Java 1.7+, java.nio.charset.StandardCharsets define constantes para Charsetinclusão UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Para Android: minSdk 19

Roger
fonte
3
você usa .toString () nisso?
Matt Broekhuis 22/10
54
.toString()funcionará, mas a função adequada é .name(). 99,9% toString não é a resposta.
19414 Roger Roger
1
O btw .displayName()também funcionará, a menos que seja substituído pela localização conforme pretendido.
19414 Roger
36
Você realmente não precisa ligar name(). Você pode transmitir diretamente o Charsetobjeto para o InputStreamReaderconstrutor.
Natix
6
E existem outras bibliotecas por aí que exigem uma String, talvez por motivos legados. Nesses casos, mantenho um Charsetobjeto por perto, normalmente derivado de StandardCharsets, e uso name()se necessário.
Magnilex
134

Agora eu uso org.apache.commons.lang3.CharEncoding.UTF_8constante de commons-lang .

yegor256
fonte
4
Para aqueles que utilizam Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Observe "lang3").
Russell Silva
24
Se você estiver usando Java 1.7, consulte a resposta de @ Roger abaixo, pois faz parte da biblioteca padrão.
Drew Stephens
2
PS "A resposta de @ Roger abaixo" é agora a resposta de @ Roger acima . ☝
Gary S.
Essa classe está obsoleta porque o Java 7 introduz o java.nio.charset.StandardCharsets
sendon1982
66

O Google Guava biblioteca (que eu recomendo qualquer maneira, se você está fazendo um trabalho em Java) tem uma Charsetsclasse com campos estáticos, como Charsets.UTF_8, Charsets.UTF_16, etc.

Desde o Java 7, você deve usar apenas java.nio.charset.StandardCharsetspara constantes comparáveis.

Observe que essas constantes não são cadeias de caracteres, são Charsetinstâncias reais . Todas as APIs padrão que usam um nome de conjunto de caracteres também têm uma sobrecarga que leva um Charsetobjeto que você deve usar.

Daniel Pryden
fonte
3
Então, deve ser Charsets.UTF_8.name ()?
AlikElzin-Kilaka
1
@kilaka Sim usar o nome () em vez de GetDisplayName () desde name () é final e GetDisplayName () não é
RKumsher
3
@ Buffalo: Por favor, leia minha resposta novamente: recomenda usar java.nio.charset.StandardCharsetsquando possível, o que não é um código de terceiros. Além disso, as definições de Guava Charsets não são "constantemente modificadas" e o AFAIK nunca quebrou a compatibilidade com versões anteriores, portanto, não acho que suas críticas sejam justificadas.
Daniel Pryden
2
@Buffalo: É assim que pode ser, mas duvido que seus problemas tenham algo a ver com a Charsetsclasse. Se você quiser reclamar sobre a goiaba, tudo bem, mas este não é o lugar para essas reclamações.
Daniel Pryden
1
Por favor, não inclua uma biblioteca de vários megabytes para obter uma string constante.
Jeffrey Blattman
50

Caso essa página apareça na pesquisa na web de alguém, a partir do Java 1.7, agora você pode usar java.nio.charset.StandardCharsets para obter acesso a definições constantes de charsets padrão.

cosjav
fonte
Eu tenho tentado usar isso, mas parece não funcionar. 'Charset.defaultCharset ());' parece funcionar depois de incluir 'java.nio.charset. *', mas não consigo me referir explicitamente ao UTF8 quando estou tentando usar 'File.readAllLines'.
Roger
1
@ Roger Qual parece ser o problema? Do que eu posso ver que você pode apenas chamar:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav
Não sei qual era o problema, mas funcionou para mim depois de mudar algo que não me lembro.
Roger
1
Você provavelmente teve que alterar a plataforma de destino no IDE. Se o 1.6 foi seu JDK mais recente quando você instalou o IDE, ele provavelmente o escolheu como padrão e o manteve por muito tempo depois de atualizar o IDE e o JDK no local.
Bitbang3r
10

Esta constante está disponível (entre outros como: UTF-16, US-ASCII, etc.) na classe org.apache.commons.codec.CharEncodingbem.

Alfredo Carrillo
fonte
9

Não há (pelo menos na biblioteca Java padrão). Os conjuntos de caracteres variam de plataforma para plataforma, portanto, não há uma lista padrão deles em Java.

Existem algumas bibliotecas de terceiros que contêm essas constantes. Uma delas é o Guava (bibliotecas principais do Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html

tskuzzy
fonte
Levei um segundo para entender isso ... As constantes Charsets da Guava são (sem surpresa) Charsets, não Strings. InputStreamReader tem outro construtor que usa um conjunto de caracteres em vez de uma sequência. Se você realmente precisa da string, é por exemplo Charsets.UTF_8.name ().
111311 Ed Staub
1
Os conjuntos de caracteres podem variar de plataforma para plataforma, mas é garantido que o UTF-8 existe.
tar
3
StandardCharsetsÉ garantido que todos os conjuntos de caracteres definidos em todas as implementações Java em todas as plataformas.
Krzysztof Krasoń
8

Você pode usar Charset.defaultCharset()API ou file.encodingpropriedade.

Mas se você quiser sua própria constante, precisará defini-la.

paulsm4
fonte
11
O conjunto de caracteres padrão geralmente é determinado pelas configurações do sistema operacional e da localidade, não acho que haja garantia de que ele permaneça o mesmo para várias invocações java. Portanto, isso não substitui um constante "utf-8" de sepcificação.
Jörn Horstmann
6

Em Java 1.7+

Não use a string "UTF-8", use o Charsetparâmetro type:

import java.nio.charset.StandardCharsets

...

new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8);
Mostafa Vatanpour
fonte
4

Se você estiver usando o OkHttp para Java / Android, poderá usar a seguinte constante:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String
JJD
fonte
2
ele é removido do OkHttp, tão próxima maneira é: Charset.forName("UTF-8").name()quando você precisar de suporte para menor Android do que API 19+ caso contrário, você pode usar:StandardCharsets.UTF_8.name()
mtrakal
3

Definições constantes para o padrão. É garantido que esses charsets estejam disponíveis em todas as implementações da plataforma Java. desde 1,7

 package java.nio.charset;
 Charset utf8 = StandardCharsets.UTF_8;
Vazgen Torosyan
fonte
0

A classe org.apache.commons.lang3.CharEncoding.UTF_8foi descontinuada após a introdução do Java 7java.nio.charset.StandardCharsets

  • nomes de codificação de caracteres @see JRE
  • @since 2.1
  • O Java 7 reprovado introduziu {@link java.nio.charset.StandardCharsets}, que define essas constantes como
  • objetos {@link Charset}. Use {@link Charset # name ()} para obter os valores de string fornecidos nesta classe.
  • Esta classe será removida em uma versão futura.
sendon1982
fonte