Dove ottenere letterale stringa "UTF-8" in Java?


490

Sto cercando di usare una costante anziché una stringa letterale in questo pezzo di codice:

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

"UTF-8"appare nel codice piuttosto spesso e sarebbe invece meglio fare riferimento ad alcune static finalvariabili. Sai dove posso trovare una tale variabile in JDK?

A proposito, su un secondo pensiero, tali costanti sono un cattivo design: i letterali statici pubblici ... non sono una soluzione per la duplicazione dei dati



1
Nota: se si è già su Java 7, utilizzare Files.newBufferedWriter(Path path, Charset cs)da NIO.
Franklin Yu,

Risposte:


836

In Java 1.7+, java.nio.charset.StandardCharsets definisce le costanti per l' Charsetinclusione UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Per Android: minSdk 19


3
usi .toString () su quello?
Matt Broekhuis,

54
.toString()funzionerà ma la funzione corretta è .name(). 99,9% toString non è la risposta.
Roger,

1
BTW .displayName()funzionerà anche a meno che non venga sovrascritto per la localizzazione come previsto.
Roger,

36
Non hai davvero bisogno di chiamare name()affatto. È possibile passare direttamente l' Charsetoggetto nel InputStreamReadercostruttore.
Natix,

6
E ci sono altre librerie là fuori che richiedono un String, forse per motivi legati al passato. In questi casi, tengo un Charsetoggetto in giro, di solito derivato StandardCharsetse usato name()se necessario.
Magnilex

134

Adesso uso la org.apache.commons.lang3.CharEncoding.UTF_8costante di commons-lang .


4
Per coloro che utilizzano Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Nota "lang3").
Russell Silva,

24
Se stai usando Java 1.7, vedi la risposta di @ Roger sotto perché fa parte della libreria standard.
Stephens il

2
PS "@ La risposta di Roger qui sotto" ora è la risposta di @ Roger sopra . ☝
Gary S.

Quella classe è obsoleta poiché Java 7 introduce java.nio.charset.StandardCharsets
sendon1982,

66

Il Google Guava libreria (che consiglio vivamente in ogni caso, se si sta facendo il lavoro in Java) ha una Charsetsclasse con i campi statici come Charsets.UTF_8, Charsets.UTF_16ecc

Da Java 7 java.nio.charset.StandardCharsetsinvece dovresti semplicemente usare costanti comparabili.

Nota che queste costanti non sono stringhe, sono Charsetistanze reali . Tutte le API standard che prendono il nome di un set di caratteri hanno anche un sovraccarico che accetta un Charsetoggetto che invece dovresti usare.


3
Quindi, dovrebbe essere Charsets.UTF_8.name ()?
AlikElzin-Kilaka

1
@kilaka Sì, usa name () invece di getDisplayName () poiché name () è definitivo e getDisplayName () non lo è
RKumsher,

3
@Buffalo: ti preghiamo di leggere di nuovo la mia risposta: si consiglia di utilizzare java.nio.charset.StandardCharsetsquando possibile, che non è un codice di terze parti. Inoltre, le definizioni di Guava Charsets non sono "costantemente modificate" e AFAIK non ha mai rotto la retrocompatibilità, quindi non credo che le tue critiche siano giustificate.
Daniel Pryden,

2
@Buffalo: È come potrebbe essere, ma dubito che i tuoi problemi abbiano avuto a che fare con la Charsetsclasse. Se vuoi lamentarti di Guava, va bene, ma non è questo il posto per quelle lamentele.
Daniel Pryden,

1
Non includere una libreria multi-megabyte per ottenere una costante di stringa.
Jeffrey Blattman,

50

Nel caso in cui questa pagina venga visualizzata nella ricerca Web di qualcuno, a partire da Java 1.7 è ora possibile utilizzare java.nio.charset.StandardCharsets per accedere a definizioni costanti di set di caratteri standard.


Ho provato a usarlo ma non sembra funzionare. 'Charset.defaultCharset ());' sembra funzionare dopo aver incluso 'java.nio.charset. *' ma non riesco a fare esplicito riferimento a UTF8 quando sto cercando di usare 'File.readAllLines'.
Roger,

1
@Roger Qual è il problema? Da quello che posso vedere puoi semplicemente chiamare:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

Non so quale fosse il problema, ma ha funzionato per me dopo aver cambiato qualcosa che non ricordo.
Roger,

1
^^^ Probabilmente dovevi cambiare la piattaforma di destinazione nell'IDE. Se 1.6 era il tuo ultimo JDK quando hai installato l'IDE, probabilmente l'ha scelto come predefinito e lo ha mantenuto come predefinito molto tempo dopo aver aggiornato sia l'IDE che il JDK sul posto.
Bitbang3r

10

Questa costante è disponibile (tra gli altri come: UTF-16, US-ASCII, etc.) nella classe org.apache.commons.codec.CharEncodingpure.


9

Non ce ne sono (almeno nella libreria Java standard). I set di caratteri variano da piattaforma a piattaforma, quindi non esiste un elenco standard di essi in Java.

Esistono alcune librerie di terze parti che contengono queste costanti. Uno di questi è Guava (librerie di base di Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


Mi ci è voluto un secondo per capire questo ... Le costanti Charsets di Guava sono (nessuna sorpresa) Charset, non Stringhe. InputStreamReader ha un altro costruttore che accetta un set di caratteri anziché una stringa. Se hai davvero bisogno della stringa, ad esempio Charsets.UTF_8.name ().
Ed Staub,

1
I set di caratteri possono variare da piattaforma a piattaforma, ma è garantito che UTF-8 esiste.
tar

3
Tutti i set di caratteri definiti in StandardCharsetssono garantiti per esistere in ogni implementazione Java su ogni piattaforma.
Krzysztof Krasoń

8

Puoi usare l' Charset.defaultCharset()API o la file.encodingproprietà.

Ma se vuoi la tua costante, dovrai definirla tu stesso.


11
Il set di caratteri predefinito è di solito determinato dal sistema operativo e dalle impostazioni locali, non credo che ci sia alcuna garanzia che rimanga lo stesso per più invocazioni Java. Quindi questo non è un sostituto per un costante "utf-8".
Jörn Horstmann,

6

In Java 1.7+

Non utilizzare la stringa "UTF-8", utilizzare invece il Charsetparametro type:

import java.nio.charset.StandardCharsets

...

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

4

Se stai usando OkHttp per Java / Android puoi usare la seguente costante:

import com.squareup.okhttp.internal.Util;

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

2
viene rimosso da OkHttp, quindi il prossimo modo è: Charset.forName("UTF-8").name()quando hai bisogno di supporto per Android inferiore rispetto all'API 19+, altrimenti puoi usare:StandardCharsets.UTF_8.name()
mtrakal

3

Definizioni costanti per lo standard. Questi set di caratteri sono garantiti per essere disponibili su ogni implementazione della piattaforma Java. dal 1.7

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

0

La classe org.apache.commons.lang3.CharEncoding.UTF_8è obsoleta dopo l'introduzione di Java 7java.nio.charset.StandardCharsets

  • @vedi i nomi di codifica dei caratteri JRE
  • @since 2.1
  • @deprecated Java 7 ha introdotto {@link java.nio.charset.StandardCharsets}, che definisce queste costanti come
  • {@link Charset} oggetti. Utilizzare {@link Charset # name ()} per ottenere i valori di stringa forniti in questa classe.
  • Questa classe verrà rimossa in una versione futura.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.