public abstract class Charset extends Object implements Comparable<Charset>
また、このクラスには、ある文字セットがサポートされているかどうかのチェック、名前による文字セットのインスタンスの検索、および現在の Java 仮想マシンでサポートされているすべての文字セットを記載したマップの構築をするための静的メソッドも定義されています。新しい文字セットを追加する場合は、CharsetProvider
クラスに定義されているサービスプロバイダインタフェースを使用します。
このクラスで定義されているすべてのメソッドは、複数の並行スレッドで安全に使用できます。
文字セット名は、次の文字を含む文字列で表されます。
文字セット名
文字セット名の最初の文字は、必ずアルファベットか数字になります。空の文字列は正当な文字セット名として認識されません。文字セット名ではアルファベットの大文字と小文字が区別されないので、2 つの文字セット名を比較する際、大文字と小文字の違いは無視されます。通常、文字セット名は RFC 2278: IANA Charset Registration Procedures の規則に準拠します。
すべての文字セットには正規名があります。このほかに、1 つ以上の別名が存在する場合もあります。このクラスの 一部の文字セットには、以前のバージョンの Java プラットフォームとの互換性を考慮した互換名が含まれています。互換名は、その文字セットの正規名か別名になります。 IANA Charset Registry に記載されている文字セットを Java プラットフォームの実装がサポートする場合、その文字セットの正規名はレジストリ内の名前になります。文字セットの多くはレジストリ内に複数の名前を持っています。この場合、レジストリは、いずれかの名前を MIME 優先とします。このように、文字セットが複数のレジストリ名を持っている場合、MIME 優先名が正規名となり、その他のレジストリ名は有効な別名となります。サポートされている文字セットが IANA レジストリに記載されていない場合、正規名は "X-" または "x-" で始まる文字列になります。
IANA 文字セットレジストリの内容は、時間の経過とともに変化します。 これに伴い、文字セットの正規名や別名も変化します。互換性を確保する必要がある場合は、文字セットの別名を削除しないこと、文字セットの正規名が変わった場合は元の正規名を別名として追加することをお勧めします。
Java プラットフォームの実装は、すべて次の標準文字セットをサポートする必要があります。サポートされているその他の文字セットについては、実装のリリースノートを参照してください。そうしたオプションの文字セットの動作は実装ごとに異なる可能性があります。
文字セット 説明 UTF-8 文字セットは、RFC 2279 によって規定されています。また、その変換形式は、ISO 10646-1 の Amendment 2 内で規定されており、Unicode Standard でも説明されています。
UTF-16 文字セットは、RFC 2781 によって規定されています。また、その変換形式は、ISO 10646-1 の Amendment 1 内で規定されており、Unicode Standard でも説明されています。
UTF-16 文字セットは 16 ビットの量を使用するため、バイト順の影響を受けます。これらのエンコーディングでは、ストリームのバイト順は、Unicode 文字 '\uFEFF' のバイト順マークで指定されます。バイト順マークの扱いは次のとおりです。
デコードの際、UTF-16BE 文字セットと UTF-16LE 文字セットは最初のバイト順マークを ZERO-WIDTH NON-BREAKING SPACE として解釈する。エンコードの際は、バイト順マークを書き込まない。 デコードの際、UTF-16 文字セットは入力ストリームの最初のバイト順マークを解釈してストリームのバイト順を決定するが、バイト順マークがない場合はビッグエンディアンバイト順を使用する。エンコードの際は、ビッグエンディアンバイト順を使用し、ビッグエンディアンバイト順マークを書き込む。 Java 仮想マシンの各インスタンスには、デフォルトの文字セットがあります。 この文字セットは、標準文字セットであるとは限りません。デフォルトの文字セットは仮想マシンの起動時に決定されますが、それは通常オペレーティングシステムが使用しているロケールと文字セットによって決まります。 このクラスの名前は、RFC 2278 で使用されている用語に由来しています。このドキュメント内で、文字セットは 1 つ以上のコード化文字集合と文字エンコーディング方式の組み合わせとして定義されています。(この定義はわかりにくいため、文字セットをコード化文字集合の同義語として定義するソフトウェアシステムもあります。)
コード化文字集合は、抽象文字の集合と整数の集合間のマッピングを表します。コード化文字集合の例として、US-ASCII、ISO 8859-1、JIS X 0201、Unicode などがあります。
一部の標準は、文字セットを対応する割り当て番号がない抽象文字の集合として定義しています。このような文字セットの例として、アルファベットがあります。ただし、文字セットとコード化文字集合の微妙な区別が実際に行われることはほとんどありません。Java API も含めて、文字セットはコード化文字集合の短縮形になっています。
文字エンコーディング方式は、1 つ以上のコード化文字集合とオクテット (8 ビットバイト) シーケンス間のマッピングです。文字エンコーディング方式の例として、UTF-8、UTF-16、ISO 2022、EUC などがあります。エンコーディング方式は通常、特定のコード化文字集合に関連付けられます。 たとえば、UTF-8 は、Unicode のエンコーディング専用です。エンコーディング方式の中には、複数のコード化文字集合に関連付けられるものもあります。たとえば、EUC を使えば、アジア地域のさまざまなコード化文字集合の文字をエンコードできます。
コード化文字集合と文字エンコーディング方式とが 1 対 1 に対応している場合、通常はそのコード化文字集合の名前にちなんだ文字セット名が付けられます。それ以外の場合は通常、エンコーディング方式 (とサポートするコード化文字集合のロケール) にちなんだ名前が付けられます。したがって、US-ASCII はコード化文字集合の名前であり、それをエンコードする文字セットの名前でもありますが、EUC-JP は日本語の JIS X 0201、JIS X 0208、および JIS X 0212 コード化文字集合をエンコードする文字セットの名前です。
Java プログラミング言語のネイティブの文字エンコーディング方式は、UTF-16 です。したがって、Java プラットフォーム内の各文字セットは、16 ビットの UTF-16 コード単位のシーケンス (つまり、文字のシーケンス) とバイトシーケンスとの間のマッピングを定義します。 name
メソッドは正規名を返します。通常、正規名はアルファベットの大文字で記述されます。aliases
メソッドは文字セットの別名を返します。
InputStreamReader
および OutputStreamWriter
クラスの getEncoding() メソッドは互換名を返します。
標準文字セット
US-ASCII
7 ビット ASCII (ISO646-US/Unicode 文字セットの Basic Latin ブロック) ISO-8859-1
ISO ラテンアルファベット No. 1 (ISO-LATIN-1) UTF-8
8 ビット UCS 変換形式 UTF-16BE
16 ビット UCS 変換形式、ビッグエンディアンバイト順 UTF-16LE
16 ビット UCS 変換形式、リトルエンディアンバイト順 UTF-16
16 ビット UCS 変換形式、オプションのバイト順マークによって識別されるバイト順
どちらの場合も、入力シーケンスの最初の要素のあとに出現したバイト順マークは省略されません。これは、ZERO-WIDTH NON-BREAKING SPACE が同じコードで表現されるからです。
StandardCharsets
クラスは、標準文字セットのそれぞれを表す定数を定義します。
用語
CharsetDecoder
, CharsetEncoder
, CharsetProvider
, Character
修飾子 | コンストラクタと説明 |
---|---|
protected |
Charset(String canonicalName, String[] aliases)
正規名と別名のセットを使って、新しい文字セットを初期化します。
|
修飾子と型 | メソッドと説明 |
---|---|
Set<String> |
aliases()
この文字セットの別名が含まれるセットを返します。
|
static SortedMap<String,Charset> |
availableCharsets()
正規文字セット名から Charset オブジェクトへのソートされたマップを構築します。
|
boolean |
canEncode()
この文字セットがエンコーディングをサポートするかどうかを判断します。
|
int |
compareTo(Charset that)
この文字セットと別の文字セットを比較します。
|
abstract boolean |
contains(Charset cs)
この文字セットに指定の文字セットが含まれているかどうかを判断します。
|
CharBuffer |
decode(ByteBuffer bb)
この文字セットで表現されたバイトを Unicode 文字にデコードする簡易メソッドです。
|
static Charset |
defaultCharset()
この Java 仮想マシンのデフォルトの文字セットを返します。
|
String |
displayName()
デフォルトロケールにおける、この文字セットの名前 (人間が読める形式) を返します。
|
String |
displayName(Locale locale)
指定ロケールにおけるこの文字セットの名前 (人間が読める形式) を返します。
|
ByteBuffer |
encode(CharBuffer cb)
Unicode 文字をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。
|
ByteBuffer |
encode(String str)
文字列をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。
|
boolean |
equals(Object ob)
このオブジェクトが別のオブジェクトと等価であるかどうかを判断します。
|
static Charset |
forName(String charsetName)
指定された文字セットの Charset オブジェクトを返します。
|
int |
hashCode()
この文字セットのハッシュコードを計算します。
|
boolean |
isRegistered()
この文字セットが IANA Charset Registry に登録されているかどうかを判別します。
|
static boolean |
isSupported(String charsetName)
指定された文字セットがサポートされているかどうかを判断します。
|
String |
name()
この文字セットの正規名を返します。
|
abstract CharsetDecoder |
newDecoder()
この文字セットの新しいデコーダを構築します。
|
abstract CharsetEncoder |
newEncoder()
この文字セットの新しいエンコーダを構築します。
|
String |
toString()
この文字セットを説明する文字列を返します。
|
protected Charset(String canonicalName, String[] aliases)
canonicalName
- この文字セットの正規名aliases
- この文字セットの別名から成る配列 (別名がない場合は null)IllegalCharsetNameException
- 正規名または別名が不正である場合public static boolean isSupported(String charsetName)
charsetName
- 要求された文字セットの名前。正規名か別名IllegalCharsetNameException
- 指定された文字セットが不正である場合IllegalArgumentException
- 指定された charsetName が null である場合public static Charset forName(String charsetName)
charsetName
- 要求された文字セットの名前。正規名か別名IllegalCharsetNameException
- 指定された文字セットが不正である場合IllegalArgumentException
- 指定された charsetName が null である場合UnsupportedCharsetException
- 指定された文字セットが現在の Java 仮想マシンでは利用できない場合public static SortedMap<String,Charset> availableCharsets()
このメソッドから返されるマップには、現在の Java 仮想マシンでサポートされている各文字セットごとにエントリが 1 つずつ含まれます。サポートされている文字セットのなかに同じ正規名を持つものが複数存在した場合、結果として得られるマップにはそのうちの 1 つだけが含まれます。 ただし、どちらの文字セットが含まれるかは未定です。
このメソッドの呼び出しや、その結果として得られるマップを利用する際には、時間のかかるディスク入出力操作やネットワーク入出力操作が発生する可能性があります。このメソッドは、ユーザーに文字セットを選択させる場合など、使用可能なすべての文字セットを列挙する必要があるアプリケーション用として提供されています。forName
メソッドでは、このメソッドを使用せずに、効率の良い増分検索アルゴリズムを採用しています。
新しい文字セットプロバイダが現在の Java 仮想マシンに対して動的に利用可能になる場合、このメソッドは毎回異なった結果を返す可能性があります。そうした変更が発生しない場合は、このメソッドから返される文字セットは、forName
メソッドから取得可能な文字セットとまったく同じになります。
public static Charset defaultCharset()
デフォルトの文字セットは仮想マシンの起動時に決定されますが、それは通常、オペレーティングシステムのロケールと文字セットによって決まります。
public final String name()
public String displayName()
このメソッドのデフォルト実装は、この文字セットの正規名だけを返します。このクラスの具象サブクラスでこのメソッドをオーバーライドすれば、ローカライズされた表示名を提供できます。
public final boolean isRegistered()
public String displayName(Locale locale)
このメソッドのデフォルト実装は、この文字セットの正規名だけを返します。このクラスの具象サブクラスでこのメソッドをオーバーライドすれば、ローカライズされた表示名を提供できます。
locale
- 表示名を取得するロケールpublic abstract boolean contains(Charset cs)
文字セット D で表現できるすべての文字を文字セット C でも表現できる場合に限り、文字セット C は文字セット D を含むと言うことができます。この関係が成立している場合、文字セット D にエンコードできるすべての文字列は、文字の置き換えを一切行うことなく、文字セット C にもエンコードできます。
文字セット C が文字セット D を「含む」と言っても、双方の文字セットが、個々の文字を表現するためにまったく同じバイトシーケンスを使用しているとは限りません。
すべての文字セットは、自身を包含しています。
このメソッドは、包含関係の近似値を計算します。このメソッドの戻り値が true であれば、指定された文字セットは確実に現在の文字セットに含まれています。ただし、戻り値が false の場合でも、指定された文字セットが現在の文字セットに含まれていることがあります。
public abstract CharsetDecoder newDecoder()
public abstract CharsetEncoder newEncoder()
UnsupportedOperationException
- この文字セットがエンコーディングをサポートしない場合public boolean canEncode()
文字セットの大半はエンコードをサポートしていますが、例外もあります。たとえば、特殊目的の自動検出文字セットなどです。この文字セットのデコーダは、入力バイトシーケンスを調査することで、複数のエンコーディング方式のうちのどれが使用されているかを決定できます。こうした文字セットはエンコードをサポートしません。 出力時に使用すべきエンコーディング方式を特定できないためです。こうした文字セットの実装では、このメソッドを、false が返されるようにオーバーライドする必要があります。
public final CharBuffer decode(ByteBuffer bb)
このメソッドを文字セット cs に対して呼び出すと、次の式と同じ結果が返されます
cs.newDecoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .decode(bb);ただし、次の呼び出しまでの間にデコーダをキャッシュできるという点で、このメソッドのほうが効率的です。
このメソッドは、不正入力シーケンスやマップ不可文字シーケンスを、この文字セットのデフォルトの置換バイト配列で置き換えます。そのようなシーケンスを検出するには、CharsetDecoder.decode(java.nio.ByteBuffer)
メソッドを直接使用してください。
bb
- デコードされる byte バッファーpublic final ByteBuffer encode(CharBuffer cb)
このメソッドを文字セット cs に対して呼び出すと、次の式と同じ結果が返されます
cs.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .encode(bb);ただし、次の呼び出しまでの間にエンコーダをキャッシュできるという点で、このメソッドのほうが効率的です。
このメソッドは、不正入力シーケンスやマップ不可文字シーケンスを、この文字セットのデフォルトの置換文字列で置き換えます。そのようなシーケンスを検出するには、CharsetEncoder.encode(java.nio.CharBuffer)
メソッドを直接使用してください。
cb
- エンコードされる char バッファーpublic final ByteBuffer encode(String str)
このメソッドを文字セット cs に対して呼び出すと、次の式と同じ結果が返されます
cs.encode(CharBuffer.wrap(s));
str
- エンコードされる文字列public final int compareTo(Charset that)
文字セットは正規名順に並べられます (アルファベットの大文字と小文字は区別されない)。
compareTo
、インタフェース: Comparable<Charset>
that
- この文字セットと比較する文字セットpublic final int hashCode()
hashCode
、クラス: Object
Object.equals(java.lang.Object)
, System.identityHashCode(java.lang.Object)
public final boolean equals(Object ob)
2 つの文字セットは、同じ正規名を持っている場合に限り等価です。文字セットがほかの型のオブジェクトと等価になることはありません。
equals
、クラス: Object
ob
- 比較対象の参照オブジェクト。Object.hashCode()
, HashMap
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.