モジュール java.base
パッケージ java.nio.charset

クラスCharset

java.lang.Object
java.nio.charset.Charset
すべての実装されたインタフェース:
Comparable<Charset>

public abstract class Charset extends Object implements Comparable<Charset>
16ビットUnicode コード単位のシーケンスとバイト・シーケンス間の指定マップです。 このクラスには、デコーダやエンコーダを作成するメソッドや、文字セットに関連付けられたさまざまな名前を取得するメソッドを定義します。 このクラスのインスタンスは不変です。

また、このクラスには、ある文字セットがサポートされているかどうかのチェック、名前による文字セットのインスタンスの検索、および現在のJava仮想マシンでサポートされているすべての文字セットを記載したマップの構築をするための静的メソッドも定義されています。 新しい文字セットを追加する場合は、CharsetProviderクラスに定義されているサービス・プロバイダ・インタフェースを使用します。

このクラスで定義されているすべてのメソッドは、複数の並行スレッドで安全に使用できます。

文字セット名

文字セット名は、次の文字を含む文字列で表されます。

  • 大文字の'A' - 'Z' ('\u0041' - '\u005a')、
  • 小文字の'a' - 'z' ('\u0061' - '\u007a')、
  • 数字の'0' - '9' ('\u0030' - '\u0039')、
  • ダッシュ文字'-' ('\u002d'HYPHEN-MINUS)
  • プラス文字'+' ('\u002b'PLUS SIGN)
  • ピリオド文字'.' ('\u002e'FULL STOP)
  • コロン文字':' ('\u003a'COLON)
  • 下線文字'_' ('\u005f'LOW LINE)
文字セット名の最初の文字は、必ずアルファベットか数字になります。 空の文字列は正当な文字セット名として認識されません。 文字セット名ではアルファベットの大文字と小文字が区別されないので、2つの文字セット名を比較する際、大文字と小文字の違いは無視されます。 通常、文字セット名はRFC 2278: IANA Charset Registration Proceduresの規則に準拠します。

すべての文字セットには正規名があります。このほかに、1つ以上の別名が存在する場合もあります。 このクラスのnameメソッドは正規名を返します。 通常、正規名はアルファベットの大文字で記述されます。 aliasesメソッドは文字セットの別名を返します。

一部の文字セットには、以前のバージョンのJavaプラットフォームとの互換性のために定義された履歴名があります。 文字セット履歴名は、標準名またはその別名のいずれかです。 InputStreamReaderおよびOutputStreamWriterクラスのgetEncoding()メソッドは互換名を返します。

IANA Charset Registryに記載されている文字セットをJavaプラットフォームの実装がサポートする場合、その文字セットの正規名はレジストリ内の名前になります。 文字セットの多くはレジストリ内に複数の名前を持っています。この場合、レジストリは、いずれかの名前をMIME優先とします。 このように、文字セットが複数のレジストリ名を持っている場合、MIME優先名が正規名となり、その他のレジストリ名は有効な別名となります。 サポートされている文字セットがIANAレジストリに記載されていない場合、正規名は"X-"または"x-"で始まる文字列になります。

IANA文字セット・レジストリの内容は、時間の経過とともに変化します。これに伴い、文字セットの正規名や別名も変化します。 互換性を確保する必要がある場合は、文字セットの別名を削除しないこと、文字セットの正規名が変わった場合は元の正規名を別名として追加することをお薦めします。

標準文字セット

Javaプラットフォームを実装するたびに、次の標準文字セットをサポートする必要があります。 他の文字セットがサポートされているかどうかを確認するには、実装のリリース・ドキュメントを参照してください。 そうしたオプションの文字セットの動作は実装ごとに異なる可能性があります。

標準文字セットの説明
Charset説明
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変換形式、オプションのバイト順マークによって識別されるバイト順

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文字セットは入力ストリームの最初のバイト順マークを解釈してストリームのバイト順を決定するが、バイト順マークがない場合はビッグエンディアン・バイト順を使用する。エンコードの際は、ビッグエンディアン・バイト順を使用し、ビッグエンディアン・バイト順マークを書き込む。

どちらの場合も、入力シーケンスの最初の要素の後に出現したバイト順マークは省略されません。これは、ZERO-WIDTH NON-BREAKING SPACEが同じコードで表現されるからです。

Java仮想マシンの各インスタンスには、デフォルトの文字セットがあります。この文字セットは、標準文字セットであるとは限りません。 デフォルトの文字セットは仮想マシンの起動時に決定されますが、それは通常オペレーティング・システムが使用しているロケールと文字セットによって決まります。

StandardCharsetsクラスは、標準文字セットのそれぞれを表す定数を定義します。

用語

このクラスの名前は、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コード単位のシーケンス(つまり、文字のシーケンス)とバイト・シーケンスとの間のマッピングを定義します。

導入されたバージョン:
1.4
関連項目:
  • コンストラクタのサマリー

    コンストラクタ
    修飾子
    コンストラクタ
    説明
    protected
    Charset(String canonicalName, String[] aliases)
    正規名と別名のセットを使って、新しい文字セットを初期化します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    final Set<String>
    この文字セットの別名が含まれるセットを返します。
    正規文字セット名からCharsetオブジェクトへのソートされたマップを構築します。
    boolean
    この文字セットがエンコーディングをサポートするかどうかを判断します。
    final int
    この文字セットと別の文字セットを比較します。
    abstract boolean
    この文字セットに指定の文字セットが含まれているかどうかを判断します。
    この文字セットで表現されたバイトをUnicode文字にデコードする簡易メソッドです。
    static Charset
    このJava仮想マシンのデフォルトの文字セットを返します。
    デフォルト・ロケールにおける、この文字セットの名前(人間が読める形式)を返します。
    指定ロケールにおけるこの文字セットの名前(人間が読める形式)を返します。
    文字列をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。
    Unicode文字をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。
    final boolean
    このオブジェクトが別のオブジェクトと等価であるかどうかを判断します。
    static Charset
    forName(String charsetName)
    指定された文字セットのCharsetオブジェクトを返します。
    final int
    この文字セットのハッシュ・コードを計算します。
    final boolean
    この文字セットがIANA Charset Registryに登録されているかどうかを判別します。
    static boolean
    isSupported(String charsetName)
    指定された文字セットがサポートされているかどうかを判断します。
    final String
    この文字セットの正規名を返します。
    この文字セットの新しいデコーダを構築します。
    この文字セットの新しいエンコーダを構築します。
    final String
    この文字セットを説明する文字列を返します。

    クラス java.lang.Objectで宣言されたメソッド

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • コンストラクタの詳細

    • Charset

      protected Charset(String canonicalName, String[] aliases)
      正規名と別名のセットを使って、新しい文字セットを初期化します。
      パラメータ:
      canonicalName - この文字セットの正規名
      aliases - この文字セットの別名から成る配列(別名がない場合はnull)
      例外:
      IllegalCharsetNameException - 正規名または別名が不正である場合
  • メソッドの詳細

    • isSupported

      public static boolean isSupported(String charsetName)
      指定された文字セットがサポートされているかどうかを判断します。
      パラメータ:
      charsetName - 要求された文字セットの名前。正規名か別名
      戻り値:
      現在のJava仮想マシンで指定された文字セットを利用できる場合に限りtrue
      例外:
      IllegalCharsetNameException - 指定された文字セットが不正である場合
      IllegalArgumentException - 指定されたcharsetNameがnullである場合
    • forName

      public static Charset forName(String charsetName)
      指定された文字セットのCharsetオブジェクトを返します。
      パラメータ:
      charsetName - 要求された文字セットの名前。正規名か別名
      戻り値:
      指定された文字セットのCharsetオブジェクト
      例外:
      IllegalCharsetNameException - 指定された文字セットが不正である場合
      IllegalArgumentException - 指定されたcharsetNameがnullである場合
      UnsupportedCharsetException - 指定された文字セットが現在のJava仮想マシンでは利用できない場合
    • availableCharsets

      public static SortedMap<String,Charset> availableCharsets()
      正規文字セット名からCharsetオブジェクトへのソートされたマップを構築します。

      このメソッドから返されるマップには、現在のJava仮想マシンでサポートされている各文字セットごとにエントリが1つずつ含まれます。 サポートされている文字セットのなかに同じ正規名を持つものが複数存在した場合、結果として得られるマップにはそのうちの1つだけが含まれます。ただし、どちらの文字セットが含まれるかは未定です。

      このメソッドの呼び出しや、その結果として得られるマップを利用する際には、時間のかかるディスク入出力操作やネットワーク入出力操作が発生する可能性があります。 このメソッドは、ユーザーに文字セットを選択させる場合など、使用可能なすべての文字セットを列挙する必要があるアプリケーション用として提供されています。 forNameメソッドでは、このメソッドを使用せずに、効率の良い増分検索アルゴリズムを採用しています。

      新しい文字セット・プロバイダが現在のJava仮想マシンに対して動的に利用可能になる場合、このメソッドは毎回異なった結果を返す可能性があります。 そうした変更が発生しない場合は、このメソッドから返される文字セットは、forNameメソッドから取得可能な文字セットとまったく同じになります。

      戻り値:
      文字セットの正規名とCharsetオブジェクトを対応付ける不変のマップ(アルファベットの大文字と小文字は区別されない)
    • defaultCharset

      public static Charset defaultCharset()
      このJava仮想マシンのデフォルトの文字セットを返します。

      デフォルトの文字セットは仮想マシンの起動時に決定されますが、それは通常、オペレーティング・システムのロケールと文字セットによって決まります。

      戻り値:
      デフォルトの文字セットのCharsetオブジェクト
      導入されたバージョン:
      1.5
    • name

      public final String name()
      この文字セットの正規名を返します。
      戻り値:
      この文字セットの正規名
    • aliases

      public final Set<String> aliases()
      この文字セットの別名が含まれるセットを返します。
      戻り値:
      この文字セットの別名が含まれる不変のセット
    • displayName

      public String displayName()
      デフォルト・ロケールにおける、この文字セットの名前(人間が読める形式)を返します。

      このメソッドのデフォルト実装は、この文字セットの正規名だけを返します。 このクラスの具象サブクラスでこのメソッドをオーバーライドすれば、ローカライズされた表示名を提供できます。

      戻り値:
      デフォルト・ロケールにおけるこの文字セットの表示名
    • isRegistered

      public final boolean isRegistered()
      この文字セットがIANA Charset Registryに登録されているかどうかを判別します。
      戻り値:
      この文字セットがIANAに登録されていることを実装者が認識している場合に限りtrue
    • displayName

      public String displayName(Locale locale)
      指定ロケールにおけるこの文字セットの名前(人間が読める形式)を返します。

      このメソッドのデフォルト実装は、この文字セットの正規名だけを返します。 このクラスの具象サブクラスでこのメソッドをオーバーライドすれば、ローカライズされた表示名を提供できます。

      パラメータ:
      locale - 表示名を取得するロケール
      戻り値:
      指定ロケールにおけるこの文字セットの表示名
    • contains

      public abstract boolean contains(Charset cs)
      この文字セットに指定の文字セットが含まれているかどうかを判断します。

      文字セットDで表現できるすべての文字を文字セットCでも表現できる場合に限り、文字セットCは文字セットD含むと言うことができます。 この関係が成立している場合、文字セットDにエンコードできるすべての文字列は、文字の置換えを一切行うことなく、文字セットCにもエンコードできます。

      文字セットCが文字セットDを「含む」と言っても、双方の文字セットが、個々の文字を表現するためにまったく同じバイト・シーケンスを使用しているとは限りません。

      すべての文字セットは、自身を包含しています。

      このメソッドは、包含関係の近似値を計算します。このメソッドの戻り値がtrueであれば、指定された文字セットは確実に現在の文字セットに含まれています。ただし、戻り値がfalseの場合でも、指定された文字セットが現在の文字セットに含まれていることがあります。

      パラメータ:
      cs - 指定された文字セット
      戻り値:
      指定された文字セットがこの文字セットに含まれる場合true
    • newDecoder

      public abstract CharsetDecoder newDecoder()
      この文字セットの新しいデコーダを構築します。
      戻り値:
      この文字セットの新しいデコーダ
    • newEncoder

      public abstract CharsetEncoder newEncoder()
      この文字セットの新しいエンコーダを構築します。
      戻り値:
      この文字セットの新しいエンコーダ
      例外:
      UnsupportedOperationException - この文字セットがエンコーディングをサポートしない場合
    • canEncode

      public boolean canEncode()
      この文字セットがエンコーディングをサポートするかどうかを判断します。

      文字セットの大半はエンコードをサポートしていますが、例外もあります。 たとえば、特殊目的の自動検出文字セットなどです。この文字セットのデコーダは、入力バイト・シーケンスを調査することで、複数のエンコーディング方式のうちのどれが使用されているかを決定できます。 こうした文字セットはエンコードをサポートしません。出力時に使用すべきエンコーディング方式を特定できないためです。 こうした文字セットの実装では、このメソッドを、falseが返されるようにオーバーライドする必要があります。

      戻り値:
      この文字セットがエンコードをサポートする場合に限りtrue
    • decode

      public final CharBuffer decode(ByteBuffer bb)
      この文字セットで表現されたバイトをUnicode文字にデコードする簡易メソッドです。

      このメソッドを文字セットcsに対して呼び出すと、次の式と同じ結果が返されます

           cs.newDecoder()
             .onMalformedInput(CodingErrorAction.REPLACE)
             .onUnmappableCharacter(CodingErrorAction.REPLACE)
             .decode(bb); 
      ただし、次の呼び出しまでの間にデコーダをキャッシュできるという点で、このメソッドのほうが効率的です。

      このメソッドは、不正入力シーケンスやマップ不可文字シーケンスを、この文字セットのデフォルトの置換バイト配列で置き換えます。 そのようなシーケンスを検出するには、CharsetDecoder.decode(java.nio.ByteBuffer)メソッドを直接使用してください。

      パラメータ:
      bb - デコードされるbyteバッファ
      戻り値:
      デコードされた文字を格納する文字バッファ
    • encode

      public final ByteBuffer encode(CharBuffer cb)
      Unicode文字をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。

      このメソッドを文字セットcsに対して呼び出すと、次の式と同じ結果が返されます

           cs.newEncoder()
             .onMalformedInput(CodingErrorAction.REPLACE)
             .onUnmappableCharacter(CodingErrorAction.REPLACE)
             .encode(bb); 
      ただし、次の呼び出しまでの間にエンコーダをキャッシュできるという点で、このメソッドのほうが効率的です。

      このメソッドは、不正入力シーケンスやマップ不可文字シーケンスを、この文字セットのデフォルトの置換文字列で置き換えます。 そのようなシーケンスを検出するには、CharsetEncoder.encode(java.nio.CharBuffer)メソッドを直接使用してください。

      パラメータ:
      cb - エンコードされるcharバッファ
      戻り値:
      エンコードされた文字を格納するbyteバッファ
    • encode

      public final ByteBuffer encode(String str)
      文字列をこの文字セットで表現されたバイトにエンコードする簡易メソッドです。

      このメソッドを文字セットcsに対して呼び出すと、次の式と同じ結果が返されます

           cs.encode(CharBuffer.wrap(s)); 

      パラメータ:
      str - エンコードされる文字列
      戻り値:
      エンコードされた文字を格納するbyteバッファ
    • compareTo

      public final int compareTo(Charset that)
      この文字セットと別の文字セットを比較します。

      文字セットは正規名順に並べられます(アルファベットの大文字と小文字は区別されない)。

      定義:
      compareTo、インタフェースComparable<Charset>
      パラメータ:
      that - この文字セットと比較する文字セット
      戻り値:
      この文字セットが指定された文字セットより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数
    • hashCode

      public final int hashCode()
      この文字セットのハッシュ・コードを計算します。
      オーバーライド:
      hashCode、クラスObject
      戻り値:
      整数値で表されるハッシュ・コード
      関連項目:
    • equals

      public final boolean equals(Object ob)
      このオブジェクトが別のオブジェクトと等価であるかどうかを判断します。

      2つの文字セットは、同じ正規名を持っている場合に限り等価です。 文字セットがほかの型のオブジェクトと等価になることはありません。

      オーバーライド:
      equals、クラスObject
      パラメータ:
      ob - 比較対象の参照オブジェクト。
      戻り値:
      この文字セットが指定のオブジェクトと等価である場合に限りtrue
      関連項目:
    • toString

      public final String toString()
      この文字セットを説明する文字列を返します。
      オーバーライド:
      toString、クラスObject
      戻り値:
      この文字セットを説明する文字列