文字コード

Revised: May/5th/2002; Since: Jan./5th/2002

文字コード

Java では、文字を Unicode で扱い、そのフォーマットである UTF を用いて入出力を扱います。この他に Java でサポートされている文字符号化方法は、 Java プラットフォームに依存しますが、Sun Microsystems から Supported Encodings (J2SDK1.3) として公開されているので確認すると良いでしょう。

日本語に関係する部分では、次の文字セットがサポートされているそうです。

標準名解説
Cp930UDC 4370 文字を含む日本語カタカナ漢字、5026 のスーパーセット
Cp939UDC 4370 文字を含む日本語ラテン文字漢字、5035 のスーパーセット
Cp942IBM OS/2 日本語、Cp932 のスーパーセット
Cp943IBM OS/2 日本語、Cp932 および Shift-JIS のスーパーセット
Cp33722IBM-eucJP - 日本語 (5050 のスーパーセット)
EUC_JPJIS X 0201、0208、0212、EUC エンコーディング、日本語
ISO2022JPJIS X 0201、ISO 2022 形式の 0208、日本語
JIS0201JIS X 0201、日本語
JIS0208JIS X 0208、日本語
JIS0212JIS X 0212、日本語
JISAutoDetectShift-JIS、EUC-JP、ISO 2022 JP の検出および変換 (Unicode への変換のみ)
MS932Windows 日本語
SJIS Shift-JIS、日本語

ISO-2022-JP (JIS), EUC-JP, Shift_JIS などはサポートされているので問題なく使えます。

ご利用のシステムにおけるデフォルトの文字符号化方法は System.getProperty("file.encoding") で取得できます。

System.out.println(System.getProperty("file.encoding"));

任意の文字コードと UNICODE をつなぐ

上で述べたとおり、標準では内部コードに UNICODE を用い、入出力には UTF を用いています。 UTF 以外の文字コードで入出力する場合は、 InputStreamReader/OutputStreamWriter を用います。

敬称関係:

java.io.InputStreamReader java.io.OutputStreamWriter
java.lang.Object
  |
  +--java.io.Reader
        |
        +--java.io.InputStreamReader
java.lang.Object
  |
  +--java.io.Writer
        |
        +--java.io.OutputStreamWriter

コンストラクタ:

InputStreamReader(InputStream in,    String enc)
OutputStreamWriter(OutputStream out, String enc) 

第二引数が文字コードを指し、 Java プラットフォームで決められた標準名 (Canonical Name) を用います。よく使うのは次の三つでしょう:

サンプル

前節で CCopy.java と言うサンプルを見ましたが、デフォルト以外の文字符号化方法で出力したい場合は、 OutputStreamWriter クラスを FileOutputStream をラップする形で利用します。

次のサンプルは、EUC-JP で符号化したファイルを、 ISO-2022-JP で出力します。

CCopyEUC2JIS.java:

import java.io.*;

class CCopyEUC2JIS {
	public static void main(String[] args) {
		try {
			//ファイルオブジェクトの作成
			File iFile = new File(args[0]);
			File oFile = new File(args[1]);

			//FileIOStream の作成
			FileInputStream fis  = new FileInputStream(iFile);
			FileOutputStream fos = new FileOutputStream(oFile);
			//ストリームのラップ
			InputStreamReader in
			       = new InputStreamReader(fis, "EUC_JP");
			OutputStreamWriter out
			       = new OutputStreamWriter(fos, "ISO2022JP");

			//文字符号化方法の確認
			System.out.println(in.getEncoding());
			System.out.println(out.getEncoding());

			//読み込みと書き込み
			int c;
			while ((c = in.read()) != -1) {
				out.write(c);
			}
			//ストリームを閉じる
			in.close();
			fis.close();
			iFile.close();
			out.close();
			fos.close();
			oFile.close();

			System.out.println("コピー終了。");

		} catch (IOException e) {
			System.out.println("Files Not Found! ");
			System.out.println(e);
		}
	}
}

ECU-JP で符号化されたテキストファイル test.txt が存在した場合の実行例を次に示します:

C:\IO>javac CCopyEUC2JIS.java

C:\IO>java CCopyEUC2JIS test.txt test_c.txt
EUC_JP
ISO2022JP
コピー終了。

C:\IO>

このサンプルではストリームのラッピングを分けて書きましたが意味のないことです。通常は次のようにまとめてしまいます。

InputStreamReader in
	= new InputStreamReader( new FileInputStream( new File(args[0])), "EUC_JP");
OutputStreamWriter out
	= new OutputStreamWriter(new FileOutputStream(new File(args[1])), "ISO2022JP");

改行コード

文字コードとは関係ないのですが、改行コードについても紹介しておきます。

行を区切る文字は OS によって異なります。一般に、 "Line Feed" と "Carriage Return" と呼ばれる特殊文字が行区切文字に採用されています。

OS と改行コード
<LF>UNIX
<CR>Macintosh
<CR><LF>Windows

Java では、この改行文字を出力する為に、特殊文字を用意しています。 "Carriage Return" は \r、"Line Feed" は \n です。

エスケープシークエンス

EscapeSequence
\b\u0008: backspace BS
\t\u0009: horizontal tab HT
\n\u000a: linefeed LF
\f\u000c: form feed FF
\r\u000d: carriage return CR
\"\u0022: double quote "
\'\u0027: single quote '
\\\u005c: backslash \

改行コードはOSに依存するので、エスケープシークエンスで記述するよりも、 BufferedWriternewLine() を利用した方が良いでしょう。

本サンプルを、条件分岐と \n\r を用いて、完全なものに作り直してみると良いでしょう。



Copyright © 2002 SUGAI, Manabu. All Rights Reserved.