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
を用いて、完全なものに作り直してみると良いでしょう。