Java'da “UTF-8” dizgi değişmezini nereden edinebilirim?


490

Bu kod parçası bir dize değişmez yerine sabit kullanmaya çalışıyorum:

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

"UTF-8"kodda oldukça sık görünür ve static finalbunun yerine bazı değişkenlere başvurmak daha iyi olur . JDK'da böyle bir değişkeni nerede bulabileceğimi biliyor musunuz?

BTW, ikinci bir düşünceye göre, bu sabitler kötü tasarımdır: Kamu Statik Değişmezleri ... Veri Çoğaltma için Çözüm Değil


11
Bu soruya bakın .
kafeinli

1
Not: Zaten Java 7 kullanıyorsanız Files.newBufferedWriter(Path path, Charset cs), NIO'dan kullanın .
Franklin Yu

Yanıtlar:


836

Java 1.7 ve sonraki sürümlerinde java.nio.charset.StandardCharsets , Charsetdahil edilecek sabitleri tanımlar UTF_8.

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Android için: minSdk 19


3
bunun üzerinde .toString () kullanıyor musunuz?
Matt Broekhuis

54
.toString()çalışır ama doğru işlevi .name(). % 99,9 toString cevap değildir.
Roger

1
btw .displayName(), amaçlandığı şekilde yerelleştirme için geçersiz kılınmadıkça da çalışır.
Roger

36
Hiç aramanıza gerek yok name(). CharsetNesneyi doğrudan yapıcıya geçirebilirsiniz InputStreamReader.
Natix

6
Ve orada Stringbelki de eski nedenlerden ötürü gerektiren başka kütüphaneler var . Bu gibi durumlarda, Charsetetrafında türetilmiş, genellikle türetilmiş bir nesneyi saklarım StandardCharsetsve name()gerekirse kullanırım .
Magnilex

134

Şimdi commons-langorg.apache.commons.lang3.CharEncoding.UTF_8 sabitini kullanıyorum .


4
Lang 3.0 kullananlar için: org.apache.commons.lang3.CharEncoding.UTF_8. (Not "lang3").
Russell Silva

24
Java 1.7 kullanıyorsanız, standart kitaplığın parçası olduğu için @ Roger'ın cevabına bakın.
Drew Stephens

2
PS "@ Roger'ın cevabı aşağıda" şimdi yukarıdaki Roger'ın cevabı . ☝
Gary S.

Java 7 java.nio.charset.StandardCharsets öğesini tanıttığından bu sınıf kullanımdan kaldırıldı
sendon1982

66

Google Guava (eğer Java işi eğer ben çok zaten öneriyoruz) kütüphanesi vardır Charsetsgibi statik alanları ile sınıf Charsets.UTF_8, Charsets.UTF_16vb

Java 7'den beri java.nio.charset.StandardCharsetsbunun yerine karşılaştırılabilir sabitler için kullanmalısınız .

Bu sabitlerin dize olmadığını, gerçek Charsetörnekler olduklarını unutmayın . Bir karakter kümesi adı alan tüm standart API'lerde, Charsetbunun yerine kullanmanız gereken bir nesneyi alan bir aşırı yükleme de vardır .


3
Öyleyse Charsets.UTF_8.name () olmalı?
AlikElzin-kilaka

1
@kilaka name () son olduğu ve getDisplayName () olmadığından
getDisplayName

3
@Buffalo: Lütfen cevabımı tekrar okuyun: java.nio.charset.StandardCharsetsüçüncü taraf kodu olmayan mümkünse kullanılmasını önerir . Ayrıca, Guava Karakter Kümesi tanımları "sürekli olarak değiştirilmez" ve AFAIK hiçbir zaman geriye dönük uyumluluğu bozmaz, bu yüzden eleştirinizin garanti altında olduğunu düşünmüyorum.
Daniel Pryden

2
@Buffalo: Böyle olabilir, ama sorunlarınızın Charsetssınıfla bir ilgisi olduğundan şüpheliyim . Guava hakkında şikayet etmek istiyorsanız, bu iyi, ama bu bu şikayetler için yer değil.
Daniel Pryden

1
Bir dize sabitini almak için lütfen çoklu megabaytlık bir kitaplık eklemeyin.
Jeffrey Blattman

50

Bu sayfa birisinin web aramasında ortaya çıkması durumunda, Java 1.7'den itibaren artık standart karakter kümelerinin sabit tanımlarına erişmek için java.nio.charset.StandardCharsets kullanabilirsiniz .


Bunu kullanmaya çalışıyorum ama işe yaramıyor gibi görünüyor. 'Charset.defaultCharset ()); 'java.nio.charset. *' ekledikten sonra çalışıyor gibi görünüyor ama 'File.readAllLines' kullanmaya çalıştığımda açıkça UTF8'e başvuramıyorum.
Roger

1
@Roger Sorun ne gibi görünüyor? Ne görebilirim sadece arayabilirsiniz:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

Sorunun ne olduğunu bilmiyorum, ama hatırlayamadığım bir şeyi değiştirdikten sonra benim için çalıştı.
Roger

1
^ ^ ^ Muhtemelen IDE'deki hedef platformu değiştirmeniz gerekiyordu. IDE'yi yüklediğinizde 1.6 en son JDK'nızsa, muhtemelen varsayılan olarak seçti ve hem IDE'yi hem de JDK'yı yerinde güncelledikten uzun süre sonra varsayılan olarak tuttu.
Bitbang3r

10

Bu sabiti (diğerleri arasında mevcuttur UTF-16, US-ASCIIsınıf, vb) org.apache.commons.codec.CharEncodingde.


9

Hiçbiri yoktur (en azından standart Java kütüphanesinde). Karakter kümeleri platformdan platforma değişir, bu nedenle Java'da standart bir liste yoktur.

Yine de bu sabitleri içeren bazı 3. taraf kütüphaneleri vardır. Bunlardan biri Guava'dır (Google çekirdek kütüphaneleri): http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


Bunu yakalamam bir saniye sürdü ... Guava'nın Charsets sabitleri (sürpriz değil) Charsets, Strings değil. InputStreamReader, dize yerine bir Charset alan başka bir kurucuya sahiptir. Dizeye gerçekten ihtiyacınız varsa, örneğin Charsets.UTF_8.name ().
Ed Staub

1
Karakter kümeleri platformdan platforma değişebilir, ancak UTF-8'in var olduğu garanti edilir.
katran

3
Tanımlanan tüm karakter kümelerinin StandardCharsetsher platformdaki her Java uygulamasında var olması garanti edilir.
Krzysztof Krasoń

8

Charset.defaultCharset()API veya file.encodingmülk kullanabilirsiniz .

Ancak kendi sabitinizi istiyorsanız, kendiniz tanımlamanız gerekir.


11
Varsayılan karakter seti genellikle işletim sistemi ve yerel ayarlarla belirlenir, birden fazla java çağrısı için aynı kaldığına dair herhangi bir garanti olduğunu düşünmüyorum. Dolayısıyla bu, sabit bir ayırıcı "utf-8" yerine geçmez.
Jörn Horstmann

6

Java 1.7 ve üstü sürümlerde

"UTF-8" dizesini kullanmayın, bunun yerine Charsettype parametresini kullanın :

import java.nio.charset.StandardCharsets

...

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

4

Eğer kullanıyorsanız OkHttp Java için / Android aşağıdaki sabiti kullanabilirsiniz:

import com.squareup.okhttp.internal.Util;

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

2
OkHttp'den kaldırılmıştır, bu yüzden bir sonraki yol: Charset.forName("UTF-8").name()API 19+'dan daha düşük Android için desteğe ihtiyacınız olduğunda şunları kullanabilirsiniz:StandardCharsets.UTF_8.name()
mtrakal

3

Standart için sabit tanımlar. Bu karakter kümelerinin Java platformunun her uygulamasında kullanılabileceği garanti edilmektedir. 1.7'den beri

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

0

org.apache.commons.lang3.CharEncoding.UTF_8Java 7 tanıtıldıktan sonra sınıf kullanımdan kaldırıldıjava.nio.charset.StandardCharsets

  • @görmek JRE karakter kodlama adlarına bakın
  • @since 2.1
  • @deprecated Java 7, bu sabitleri şu şekilde tanımlayan {@link java.nio.charset.StandardCharsets} ürününü tanıttı.
  • {@link Charset} nesneleri. Bu sınıfta verilen dize değerlerini almak için {@link Charset # name ()} kullanın.
  • Bu sınıf gelecekteki bir sürümde kaldırılacak.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.