Di mana mendapatkan string "UTF-8" literal di Jawa?

490

Saya mencoba menggunakan konstanta alih-alih string literal dalam potongan kode ini:

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

"UTF-8"muncul dalam kode agak sering, dan akan jauh lebih baik untuk merujuk ke beberapa static finalvariabel saja. Apakah Anda tahu di mana saya dapat menemukan variabel seperti itu di JDK?

BTW, jika dipikir-pikir, konstanta seperti itu adalah desain yang buruk: Literatur Statis Publik ... Bukan Solusi untuk Duplikasi Data

yegor256
sumber
11
Lihat pertanyaan ini .
berkafein
1
Catatan: jika Anda sudah menggunakan Java 7, gunakan Files.newBufferedWriter(Path path, Charset cs)dari NIO.
Franklin Yu

Jawaban:

836

Di Java 1.7+, java.nio.charset.StandardCharsets mendefinisikan konstanta untuk Charsetmenyertakan UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Untuk Android: minSdk 19

Roger
sumber
3
apakah Anda menggunakan .toString ()?
Matt Broekhuis
54
.toString()akan bekerja tetapi fungsi yang tepat adalah .name(). 99,9% toString bukan jawabannya.
Roger
1
btw .displayName()juga akan berfungsi kecuali diganti untuk lokalisasi sebagaimana dimaksud.
Roger
36
Anda tidak perlu menelepon name()sama sekali. Anda dapat langsung mengirimkan Charsetobjek ke InputStreamReaderkonstruktor.
Natix
6
Dan ada lib lain di luar sana yang memang membutuhkan String, mungkin karena alasan warisan. Dalam kasus seperti itu, saya menyimpan Charsetobjek di sekitar, biasanya berasal dari StandardCharsets, dan digunakan name()jika diperlukan.
Magnilex
134

Sekarang saya menggunakan org.apache.commons.lang3.CharEncoding.UTF_8konstanta dari commons-lang .

yegor256
sumber
4
Bagi mereka yang menggunakan Lang 3.0: org.apache.commons.lang3.CharEncoding.UTF_8. (Catatan "lang3").
Russell Silva
24
Jika Anda menggunakan Java 1.7, lihat jawaban @ Roger di bawah karena ini adalah bagian dari perpustakaan standar.
Drew Stephens
2
PS "@ jawaban Roger di bawah" sekarang menjadi jawaban @ Roger di atas . ☝
Gary S.
Kelas itu sudah tidak digunakan lagi sejak Java 7 memperkenalkan java.nio.charset.StandardCharsets
sendon1982
66

The Google Jambu perpustakaan (yang saya akan sangat menyarankan pula, jika Anda melakukan pekerjaan di Jawa) memiliki Charsetskelas dengan bidang statis seperti Charsets.UTF_8, Charsets.UTF_16, dll

Karena Java 7, Anda hanya harus menggunakan java.nio.charset.StandardCharsetskonstanta yang sebanding.

Perhatikan bahwa konstanta ini bukan string, mereka adalah Charsetcontoh aktual . Semua API standar yang menggunakan nama karakter juga memiliki kelebihan yang mengambil Charsetobjek yang harus Anda gunakan sebagai gantinya.

Daniel Pryden
sumber
3
Jadi, seharusnya Charsets.UTF_8.name ()?
AlikElzin-kilaka
1
@kilaka Ya gunakan nama () alih-alih getDisplayName () karena nama () adalah final dan getDisplayName () tidak
RKumsher
3
@Buffalo: Harap baca jawaban saya lagi: ini merekomendasikan penggunaan java.nio.charset.StandardCharsetsbila memungkinkan, yang bukan kode pihak ketiga. Selain itu, definisi Guava Charsets tidak "terus dimodifikasi" dan AFAIK tidak pernah merusak kompatibilitas, jadi saya rasa kritik Anda tidak diperlukan.
Daniel Pryden
2
@Buffalo: Memang benar, tapi saya ragu masalah Anda ada hubungannya dengan Charsetskelas. Jika Anda ingin mengeluh tentang Jambu Biji, itu baik-baik saja, tetapi ini bukan tempat untuk keluhan itu.
Daniel Pryden
1
Harap jangan sertakan pustaka multi-megabyte untuk mendapatkan satu string konstan.
Jeffrey Blattman
50

Jika halaman ini muncul di pencarian web seseorang, pada Java 1.7 Anda sekarang dapat menggunakan java.nio.charset.StandardCharsets untuk mendapatkan akses ke definisi konstan standar charset.

cosjav
sumber
Saya sudah mencoba menggunakan ini tetapi sepertinya tidak berhasil. 'Charset.defaultCharset ());' tampaknya berfungsi setelah menyertakan 'java.nio.charset. *' tetapi saya tidak bisa merujuk secara eksplisit ke UTF8 ketika saya mencoba menggunakan 'File.readAllLines'.
Roger
1
@Roger Apa yang tampaknya menjadi masalah? Dari apa yang saya lihat Anda bisa menelepon:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav
Saya tidak tahu apa masalahnya, tetapi berhasil setelah saya mengubah sesuatu yang tidak bisa saya ingat.
Roger
1
^^^ Anda mungkin harus mengubah platform target di IDE. Jika 1.6 adalah JDK terbaru Anda ketika Anda menginstal IDE, mungkin itu mengambilnya sebagai default & menyimpannya sebagai default lama setelah Anda memperbarui IDE dan JDK sendiri di tempat.
Bitbang3r
10

Konstan ini tersedia (antara lain sebagai: UTF-16, US-ASCII, dll) di kelas org.apache.commons.codec.CharEncodingjuga.

Alfredo Carrillo
sumber
9

Tidak ada (setidaknya di perpustakaan Java standar). Set karakter bervariasi dari platform ke platform sehingga tidak ada daftar standar di Jawa.

Ada beberapa perpustakaan pihak ke-3 yang mengandung konstanta ini. Salah satunya adalah Guava (perpustakaan inti Google): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html

tskuzzy
sumber
Butuh waktu sedetik untuk memahami hal ini ... Konstanta Gua Charset Guava (tidak mengejutkan), bukan Charset, bukan String. InputStreamReader memiliki konstruktor lain yang mengambil Charset daripada string. Jika Anda benar-benar membutuhkan string, mis. Charsets.UTF_8.name ().
Ed Staub
1
Kumpulan karakter dapat bervariasi dari satu platform ke platform lainnya, tetapi UTF-8 dijamin ada.
tar
3
Semua rangkaian karakter yang didefinisikan dalam StandardCharsetsdijamin ada di setiap implementasi Java pada setiap platform.
Krzysztof Krasoń
8

Anda dapat menggunakan Charset.defaultCharset()API atau file.encodingproperti.

Tetapi jika Anda ingin konstanta Anda sendiri, Anda harus mendefinisikannya sendiri.

paulsm4
sumber
11
Charset default biasanya ditentukan oleh pengaturan OS dan lokal, saya tidak berpikir ada jaminan bahwa itu tetap sama untuk beberapa permintaan java. Jadi ini bukan pengganti untuk pemisahan konstan "utf-8".
Jörn Horstmann
6

Di Jawa 1.7+

Jangan gunakan string "UTF-8", sebagai gantinya gunakan Charsetparameter tipe:

import java.nio.charset.StandardCharsets

...

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

Jika Anda menggunakan OkHttp untuk Java / Android Anda dapat menggunakan konstanta berikut:

import com.squareup.okhttp.internal.Util;

Util.UTF_8; // Charset
Util.UTF_8.name(); // String
JJD
sumber
2
itu dihapus dari OkHttp, jadi cara selanjutnya adalah: Charset.forName("UTF-8").name()ketika Anda membutuhkan dukungan untuk Android yang lebih rendah dari API 19+ jika tidak, Anda dapat menggunakan:StandardCharsets.UTF_8.name()
mtrakal
3

Definisi konstan untuk standar. Charset ini dijamin akan tersedia di setiap implementasi platform Java. sejak 1.7

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

Kelas org.apache.commons.lang3.CharEncoding.UTF_8tidak digunakan lagi setelah Java 7 diperkenalkanjava.nio.charset.StandardCharsets

  • @lihat nama penyandian karakter JRE
  • @ sejak 2.1
  • @deprecated Java 7 memperkenalkan {@link java.nio.charset.StandardCharsets}, yang mendefinisikan konstanta ini sebagai
  • {@link Charset} objek. Gunakan {@link Charset # name ()} untuk mendapatkan nilai string yang disediakan di kelas ini.
  • Kelas ini akan dihapus dalam rilis mendatang.
sendon1982
sumber