Próbuję użyć stałej zamiast literału ciągu w tym fragmencie kodu:
new InputStreamReader(new FileInputStream(file), "UTF-8")
"UTF-8"
pojawia się w kodzie dość często i znacznie lepiej byłoby odwoływać się do jakiejś static final
zmiennej. Czy wiesz, gdzie mogę znaleźć taką zmienną w JDK?
BTW, z drugiej strony, takie stałe są złym projektem: Publiczne literały statyczne ... nie są rozwiązaniem dla powielania danych
Files.newBufferedWriter(Path path, Charset cs)
z NIO.Odpowiedzi:
W Javie 1.7+ java.nio.charset.StandardCharsets definiuje stałe do
Charset
włączeniaUTF_8
.Dla systemu Android: minSdk 19
źródło
.toString()
będzie działać, ale właściwa jest funkcja.name()
. 99,9% toString nie jest odpowiedzią..displayName()
będzie również działać, chyba że zostanie zastąpione lokalizacją zgodnie z przeznaczeniem.name()
. Możesz bezpośrednio przekazaćCharset
obiekt doInputStreamReader
konstruktora.String
, być może z powodów historycznych. W takich przypadkach trzymam wCharset
pobliżu obiekt, zwykle pochodzący z niegoStandardCharsets
i używam go wname()
razie potrzeby.Teraz używam
org.apache.commons.lang3.CharEncoding.UTF_8
stałej z commons-lang .źródło
org.apache.commons.lang3.CharEncoding.UTF_8
. (Uwaga „lang3”).Biblioteka Google Guava (którą i tak bardzo polecam, jeśli pracujesz w Javie) ma
Charsets
klasę z statycznych pól takich jakCharsets.UTF_8
,Charsets.UTF_16
itpOd wersji Java 7
java.nio.charset.StandardCharsets
zamiast tego powinieneś używać zamiast porównywalnych stałych.Zauważ, że te stałe nie są ciągami, są rzeczywistymi
Charset
instancjami. Wszystkie standardowe interfejsy API, które przyjmują nazwę zestawu znaków, mają również przeciążenie, które zabieraCharset
obiekt, którego należy użyć zamiast tego.źródło
java.nio.charset.StandardCharsets
jeśli to możliwe, użycie , które nie jest kodem strony trzeciej. Ponadto definicje zestawów znaków Guava nie są „ciągle modyfikowane”, a AFAIK nigdy nie zerwała kompatybilności wstecznej, więc nie sądzę, aby twoja krytyka była uzasadniona.Charsets
klasą. Jeśli chcesz narzekać na Guava, to w porządku, ale to nie jest miejsce na te skargi.W przypadku pojawienia się tej strony podczas wyszukiwania w sieci, od wersji Java 1.7 możesz teraz używać java.nio.charset.StandardCharsets, aby uzyskać dostęp do stałych definicji standardowych zestawów znaków.
źródło
Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
Stała ta dostępna jest (między innymi jak:
UTF-16
,US-ASCII
, itd.) W klasieorg.apache.commons.codec.CharEncoding
, jak również.źródło
Nie ma ich (przynajmniej w standardowej bibliotece Java). Zestawy znaków różnią się w zależności od platformy, więc w Javie nie ma standardowej listy.
Istnieją jednak biblioteki innych firm, które zawierają te stałe. Jedną z nich jest Guava (podstawowe biblioteki Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html
źródło
StandardCharsets
są gwarantowane w każdej implementacji Java na każdej platformie.Możesz użyć
Charset.defaultCharset()
API lubfile.encoding
właściwości.Ale jeśli chcesz mieć swoją stałą, musisz ją zdefiniować sam.
źródło
W Javie 1.7+
Nie używaj ciągu „UTF-8”, zamiast tego użyj
Charset
parametru type:źródło
Jeśli używasz OkHttp dla Java / Android, możesz użyć następującej stałej:
źródło
Charset.forName("UTF-8").name()
kiedy potrzebujesz wsparcia dla Androida niższego niż API 19+, w przeciwnym razie możesz użyć:StandardCharsets.UTF_8.name()
Stałe definicje normy. Te zestawy znaków są z pewnością dostępne na każdej implementacji platformy Java. od 1.7
źródło
Klasa
org.apache.commons.lang3.CharEncoding.UTF_8
jest przestarzała po wprowadzeniu Java 7java.nio.charset.StandardCharsets
źródło