Javaで「UTF-8」文字列リテラルを取得する場所


490

次のコードでは、文字列リテラルの代わりに定数を使用しようとしています。

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

"UTF-8"かなり頻繁にコードに現れ、static final代わりにいくつかの変数を参照する方がはるかに良いでしょう。このような変数がJDKのどこにあるか知っていますか?

ちなみに、考え直してみると、このような定数は悪い設計です。パブリックスタティックリテラルはデータ複製のソリューションではありません



1
注:すでにJava 7を使用している場合はFiles.newBufferedWriter(Path path, Charset cs)、NIOから使用してください。
フランクリンYu

回答:


836

Java 1.7以降では、java.nio.charset.StandardCharsetsはをCharset含めるための定数を定義しますUTF_8

import java.nio.charset.StandardCharsets;

...

StandardCharsets.UTF_8.name();

Androidの場合:minSdk 19


3
その上で.toString()を使用しますか?
Matt Broekhuis 2013年

54
.toString()動作しますが、適切な機能は.name()です。99.9%toStringは答えではありません。
ロジャー、

1
btw .displayName()は、ローカライズのためにオーバーライドされない限り、意図したとおりに機能します。
ロジャー、

36
本当に電話する必要はありませんname()CharsetオブジェクトをInputStreamReaderコンストラクタに直接渡すことができます。
Natix 2014年

6
そしてString、おそらくレガシーの理由のために、を必要とする他のlibが世に出ています。このような場合、私はCharsetオブジェクトを保持し、通常はから派生させStandardCharsetsname()必要に応じて使用します。
Magnilex 2015年

134

今度org.apache.commons.lang3.CharEncoding.UTF_8commons-langの定数を使用します。


4
:ラング3.0を使用してそれらのためにorg.apache.commons.lang3.CharEncoding.UTF_8。(「lang3」に注意してください)。
Russell Silva

24
Java 1.7を使用している場合は、標準ライブラリの一部であるため、以下の@Rogerの回答を参照してください。
ドリュースティーブンス

2
PS「下の@ロジャーの答え」は、今上の@ロジャーの答えです。☝
ゲーリー・S.

Java 7がjava.nio.charset.StandardCharsetsを導入したため、このクラスは非推奨になりました
sendon1982

66

Googleのグアバ(あなたはJavaで仕事をしている場合、私は非常に、とにかくお勧めします)ライブラリが持つCharsetsような静的フィールドを持つクラスCharsets.UTF_8Charsets.UTF_16などを、

Java 7以降では、java.nio.charset.StandardCharsets代わりに同等の定数を使用する必要があります。

これらの定数は文字列ではなく、実際のCharsetインスタンスであることに注意してください。文字セット名を受け取るすべての標準APIには、Charset代わりに使用する必要があるオブジェクトを受け取るオーバーロードもあります。


3
したがって、Charsets.UTF_8.name()にする必要がありますか?
AlikElzin-kilaka 2013年

1
@kilakaええname()は最終でgetDisplayName()は最終ではないため、getDisplayName()ではなくname()を使用します
RKumsher

3
@バッファロー:もう一度私の答えを読んでください:java.nio.charset.StandardCharsets可能な場合は使用することをお勧めします。これはサードパーティのコードではありません。さらに、Guava Charsetsの定義は「常に変更」されておらず、AFAIKは下位互換性を壊していないため、あなたの批判は正当化されないと思います。
Daniel Pryden 2017年

2
@バッファロー:それはそうかもしれませんが、あなたの問題がCharsetsクラスと関係があるとは思えません。グアバについて不満を言いたい場合はそれで結構ですが、ここはそれらの不満の場所ではありません。
Daniel Pryden 2017年

1
1つの文字列定数を取得するためにマルチメガバイトのライブラリを含めないでください。
Jeffrey Blattman、2018年

50

このページが誰かのWeb検索で表示された場合、Java 1.7以降では、java.nio.charset.StandardCharsetsを使用して標準文字セットの定数定義にアクセスできます。


私はこれを使おうとしましたが、うまくいかないようです。'Charset.defaultCharset());' 「java.nio.charset。*」をインクルードした後は機能するようですが、「File.readAllLines」を使用しようとすると、UTF8を明示的に参照できないようです。
ロジャー

1
@ロジャー何が問題に思われる?私が見ることができるものから、あなたはただ電話することができます:Files.readAllLines(Paths.get("path-to-some-file"), StandardCharsets.UTF_8);
cosjav

何が問題だったかはわかりませんが、思い出せないものを変えたところ、うまくいきました。
ロジャー

1
^^^ IDEでターゲットプラットフォームを変更する必要があったと思われます。IDEをインストールしたときに1.6が最新のJDKであった場合、おそらくそれをデフォルトとして選択し、IDEとJDKの両方をインプレースで更新した後もずっとデフォルトのままにしました。
Bitbang3r 2013年


9

何もありません(少なくとも標準のJavaライブラリでは)。文字セットはプラットフォームごとに異なるため、Javaの標準的なリストはありません。

ただし、これらの定数を含むサードパーティのライブラリがいくつかあります。これらの1つはGuava(Googleコアライブラリ)です:http : //guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Charsets.html


これに追いつくのに1秒かかりました... GuavaのCharsets定数は(驚きではありません)Charsetsであり、Stringではありません。InputStreamReaderには、文字列ではなくCharsetを取る別のコンストラクタがあります。文字列が本当に必要な場合は、たとえばCharsets.UTF_8.name()です。
Ed Staub、2011

1
文字セットはプラットフォームによって異なる場合がありますが、UTF-8の存在が保証されています。
tar

3
で定義されてStandardCharsetsいるすべての文字セットは、すべてのプラットフォームのすべてのJava実装に存在することが保証されています。
KrzysztofKrasoń16年

8

Charset.defaultCharset()APIまたはfile.encodingプロパティを使用できます。

ただし、独自の定数が必要な場合は、自分で定義する必要があります。


11
デフォルトの文字セットは通常、OSとロケールの設定によって決定されます。複数のJava呼び出しで同じままであるという保証はないと思います。そのため、これは「utf-8」を指定する定数の代わりにはなりません。
ジョーンHorstmann

6

Java 1.7以降

「UTF-8」文字列を使用せず、代わりにCharsetタイプパラメータを使用します。

import java.nio.charset.StandardCharsets

...

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

4

あなたが使用している場合はOkHttpのJava / Androidのためには、次の定数を使用することができます。

import com.squareup.okhttp.internal.Util;

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

2
次の方法があるので、それは、OkHttpから削除されます:Charset.forName("UTF-8").name()あなたはAPIよりも低いためのAndroidをサポートする必要がある場合は19+そうでなければ、使用することができます:StandardCharsets.UTF_8.name()
mtrakal

3

標準の定数定義。これらの文字セットは、Javaプラットフォームのすべての実装で使用できることが保証されています。1.7以降

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

0

org.apache.commons.lang3.CharEncoding.UTF_8Java 7が導入された後、クラスは廃止予定java.nio.charset.StandardCharsets

  • @JRE 文字エンコーディング名を参照
  • @ 2.1以降
  • @deprecated Java 7では、これらの定数を次のように定義する{@link java.nio.charset.StandardCharsets}が導入されました。
  • {@link Charset}オブジェクト。このクラスで提供される文字列値を取得するには、{@ link Charset#name()}を使用します。
  • このクラスは将来のリリースで削除される予定です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.