Revised: May/5th/2002; Since: Jan./5th/2002
Java では、文字を Unicode で扱い、そのフォーマットである UTF を用いて入出力を扱います。この他に Java でサポートされている文字符号化方法は、 Java プラットフォームに依存しますが、Sun Microsystems から Supported Encodings (J2SDK1.3) として公開されているので確認すると良いでしょう。
日本語に関係する部分では、次の文字セットがサポートされているそうです。
| 標準名 | 解説 |
|---|---|
| Cp930 | UDC 4370 文字を含む日本語カタカナ漢字、5026 のスーパーセット |
| Cp939 | UDC 4370 文字を含む日本語ラテン文字漢字、5035 のスーパーセット |
| Cp942 | IBM OS/2 日本語、Cp932 のスーパーセット |
| Cp943 | IBM OS/2 日本語、Cp932 および Shift-JIS のスーパーセット |
| Cp33722 | IBM-eucJP - 日本語 (5050 のスーパーセット) |
| EUC_JP | JIS X 0201、0208、0212、EUC エンコーディング、日本語 |
| ISO2022JP | JIS X 0201、ISO 2022 形式の 0208、日本語 |
| JIS0201 | JIS X 0201、日本語 |
| JIS0208 | JIS X 0208、日本語 |
| JIS0212 | JIS X 0212、日本語 |
| JISAutoDetect | Shift-JIS、EUC-JP、ISO 2022 JP の検出および変換 (Unicode への変換のみ) |
| MS932 | Windows 日本語 |
| SJIS | Shift-JIS、日本語 |
ISO-2022-JP (JIS), EUC-JP, Shift_JIS などはサポートされているので問題なく使えます。
ご利用のシステムにおけるデフォルトの文字符号化方法は System.getProperty("file.encoding") で取得できます。
System.out.println(System.getProperty("file.encoding"));
上で述べたとおり、標準では内部コードに 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) を用います。よく使うのは次の三つでしょう:
SJIS... Shift JISISO2022JP... JIS と呼ばれることが多い文字コードEUC_JP... 日本語拡張 UNIX コード。前節で 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" と呼ばれる特殊文字が行区切文字に採用されています。
| <LF> | UNIX |
|---|---|
| <CR> | Macintosh |
| <CR><LF> | Windows |
Java では、この改行文字を出力する為に、特殊文字を用意しています。 "Carriage Return" は \r、"Line Feed" は \n です。
| \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に依存するので、エスケープシークエンスで記述するよりも、 BufferedWriter の newLine() を利用した方が良いでしょう。
本サンプルを、条件分岐と \n、\r を用いて、完全なものに作り直してみると良いでしょう。