- 4.1. java.nio.charset パッケージ
- 4.2. Charset クラス
- 4.3. CharsetEncoderクラス
- 4.4. CharsetDecoderクラス
- 4.5. CoderResultクラス
4.2. Charset クラス
Charsetクラスは各種文字セットを表すためのクラスです。ある文字セットに対応するCharsetインスタンスを取得するには、CharsetクラスのstaticメソッドであるforNameメソッドを使用します。例えば、EUC-JPを表すCharsetインスタンスを取得するには次のようにします。
Charset charset = Charset.forName("EUC-JP");
それぞれの文字セットには必ず1つの標準名があり、また複数の別名を持つことが許されております。forNameメソッドでは標準名と別名のどちらも使用することができます。例えば標準名「EUC-JP」の文字セットには「eucjis」「x-eucjp」「csEUCPkdFmtjapanese」「eucjp」「Extended_UNIX_Code_Packed_Format_for_Japanese」「x-euc-jp」「euc_jp」 といった別名が存在します。 forNameメソッドでどの名前を使用しても取得されるインスタンスは同等のものです。文字セットの名前を取得するには、以下のメソッドを使用します。
- String name() - 文字セットの標準名を返します
- Set aliases() - 文字セットの別名をすべて含むセットを返します
仮想マシンがどの文字セットをサポートしているかは実装依存ですが、以下の文字セットは必ずサポートしなければいけないことになっています。
- US-ASCII
- ISO-8859-1
- UTF-8
- UTF-16BE
- UTF-16LE
- UTF-16
SunのJ2SE1.4.2ではこれ以外にも「EUC-JP」や「Shift-JIS」など多数の文字セットがサポートされています。仮想マシンがある文字セットをサポートしていているかどうかを調べるには、Charsetクラスのstaticメソッドである isSupported メソッドを使用します。またサポートしている文字セットすべてを含むマップを取得するためのavailableCharsetsメソッドも存在します。
文字列をエンコード(Unicodeから特定の文字セットに変換)またはデコード(特定の文字セットからUnicodeに変換)するには、CharsetEncoder/CharsetDecodeクラスを使用します。ある文字セットに対応するCharsetEncoder/CharsetDecoderインスタンスを取得するには次のメソッドを使用します。
- CharsetEncoder newEncoder()
- CharsetDecoder newDecoder()
CharsetEncoder/CharsetDecoderクラスの使用方法は次節以降で説明しますが、Charsetクラスにも文字列をエンコード・デコードするための簡易メソッドが用意されています。ここではそれらのメソッドについて説明します。
- ByteBuffer encode(CharBuffer cb)
- ByteBuffer encode(String str)
- CharBuffer decode(ByteBuffer bb)
エンコードするためのメソッドには、CharBufferを入力とするものとStringを入力するものの2種類が用意されています。デコードするためのメソッドは1種類のみです。これらのメソッドが「簡易」とされているのは、不正入力や変換できない文字が存在したときの動作(文字セットで決められている代替文字に変換される)が変更できない点です。CharsetEncoder/CharsetDecoderクラスを使用すると、そのようなエラーが発生したときの動作を変更することができます。
(実習課題1)
EUC-JP のテキストファイルを Windows-31J(MS932)に変換するプログラムを作成しなさい。入力するファイル名はコマンドライン引数で指定するものとし、出力ファイル名は入力ファイル名に「.ms932」を付加したものとすること。java.io.InputStreamReaderなどは使用せず、NIOの FileChannelやCharsetクラスを利用して実現すること。