Javaの文字コード Edit

Javaにおける文字/文字列の扱い方 Edit

http://www.itarchitect.jp/beginners/-/10422.html

実験プログラム GetBytes.java

import java.io.*;

public class GetBytes {
    public static void main(String[] args) {
        String s = "こんにちは、世界!";
        System.out.println(s);

        int len = s.length();
        System.out.println("len = " + Integer.toString(len));

        try {
            byte[] bytes = s.getBytes("UTF-8");
            int bytesLen = bytes.length;
            System.out.println("byteLen = " + Integer.toString(bytesLen));

            for (int i=0; i<len; i++) {
                System.out.print(Integer.toString(s.charAt(i)) + " ");
            }
            System.out.print("\n");

            for (int i=0; i<bytesLen; i++) {
                System.out.print(Integer.toHexString(bytes[i] & 0xFF).toUpperCase() + " ")
            }
            System.out.print("\n");
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}

結果:

[~/tmp/java/getBytes:1]$ javac GetBytes.java && java GetBytes
こんにちは、世界!
len = 9
byteLen = 27
12371 12435 12395 12385 12399 12289 19990 30028 65281
E3 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF E3 80 81 E4 B8 96 E7 95 8C EF BC 81

要するに、getBytes() は UTF-16 から指定文字コードへの変換を行うようだ。

Unicodeのバージョン Edit

http://www.itarchitect.jp/beginners/-/10422.html
↑のページが詳しく書いてあるが、Unicodeのバージョンに関してはだいぶ古くなっている。

「Java言語仕様第3版」の「3.1 Unicode」によると
http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.1

JDKのバージョンUnicodeのバージョン
JDK 1.1以前1.1.5
JDK 1.12.0
JDK 1.1.72.1
J2SE 1.43.0
J2SE 5.04.0

となっている。

Javaで採用されているUnicode 2.1では、約4万字程度の文字が割り当てられています※1。

と書いてあるが、Unicode 3.1以降でははるかに多くなっている。
参照:http://ja.wikipedia.org/wiki/Unicode

Javaで使える文字コード名 Edit

JDK 1.5でサポートされているエンコーディング
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/intl/encoding.doc.html

クラスファイルの文字コードはUTF-8 Edit

Windows上で

System.out.println("ABCこんにちは、世界!ABC\n"); 

と書いてShift_JISで保存し、javaでコンパイルする。
そしてクラスファイルをバイナリエディタで開いてみると次のような部分がある。

0000090: 1901 0022 4142 43e3 8193 e382 93e3 81ab  ..."ABC.........
00000a0: e381 a1e3 81af e380 81e4 b896 e795 8cef  ................
00000b0: bc81 4142 430a 0700 1a0c 001b 001c 0100  ..ABC...........

""の文字列の部分がUTF-8になっていることがわかる。

javaのソースを別のエンコーディングで書くには Edit

システムのデフォルトエンコーディングと異なるエンコーディングで書いたソースをコンパイルするには

javac -encodng Shift_JIS

のように-encodingオプションを指定する。
すると""の文字列の部分が、ソースファイルのエンコーディングからシステムのデフォルトエンコーディニグに変換されてクラスファイルになる。

Apache commons Edit

commons-lang Edit

ToStringBuilderが超便利。

commons-logging Edit

loggingの使い方
http://www.atmarkit.co.jp/fjava/rensai2/jakarta09/jakarta09.html

O/Rマッピング Edit

http://www.thinkit.co.jp/free/article/0606/13/7/
Hibernate, Torque, iBATIS の比較がよい。

第1回 O/Rマッピングとは?

第2回 SQLを直接記述できるiBATIS(前編)

第3回 SQLを直接記述できるiBATIS(後編)

第4回 SQLを記述しない「Torque」

第5回 多機能なHibernate(前編)

第6回 多機能なHibernate(後編)

第7回 それぞれのメリット/デメリット

アクセス修飾子 Edit

自ファイル他ファイル
修飾子自クラスサブクラス他クラスサブクラス他クラス
public
protected×
なし××
private××××

http://www.tohoho-web.com/java/modifier.htm#access

J2SE 5.0で予約語が増えた Edit

 新予約語:enum
 JDK 1.3や1.4で作成されたアプリケーションをJDK 5.0でリコンパイルする場合は注意!

参考:
Wikipedia:Javaの予約語

逆引き Edit

数値 Edit

文字列 Edit

文字の種別(alphabet・ひらがな・カタカナ・漢字)を調べる Edit

正規表現でUnicodeブロックを使うと文字の種別を調べることができる。

// 文字列が、漢字だけからなるかどうかを調べるプログラム
import java.io.*;
import java.util.regex.*;

public class Match {

    public static void main(String[] args) {
        String regex = "\\p{InCJKUnifiedIdeographs}+";
        String texts[] = {
            "漢字変換します",
            "漢字変換",
            "あいうえお"
        };

        Pattern p = Pattern.compile(regex);


        for (int i=0; i<texts.length; i++) {
            Matcher m = p.matcher(texts[i]);

            if (m.matches()) {
                System.out.println("Match     :" + texts[i]);
            } else {
                System.out.println("Not match :" + texts[i]);
            }
        }
    }
}

ASCII文字だけであるか判定するには、

String regex = "\\p{ASCII}+";

と変更すればよい。

参考:
MODULE.JP - 日本語に絡むUnicodeブロックとスクリプト(正規表現)
http://module.jp/blog/regex_unicode_prop.html

日付 Edit

ファイル・ディレクトリ Edit

CSVファイル読み書き Edit

csv-lib
http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=Libs%26Tools

Excelと同じく、値の中にカンマが含まれている場合は""で囲む形式に対応している。

abc," d, e, f",""hij""

[0,0] abc
[0,1]  d, e, f
[0,2] "hij"

正規表現 Edit

実行環境・ツール Edit

その他 Edit

カレントディレクトリを取得する Edit

String str = new File(".").getAbsoluteFile().getParentFile().getAbsolutePath();

または

String str = System.getProperty("user.dir");

すべてのプロパティを画面に表示

System.getProperties().list(System.out);

その他のシステムプロパティ
http://www.hcn.zaq.ne.jp/no-ji/javamemo/java_util_Properties.html

java.util

Properties


Windowsのiniファイルのように、アプリケーションの設定値などを保存するのに適しています。
最近はXML形式の場合も増えています。 システムのプロパティもこの形式です。 ファイルに出力されるときには、ソートされていないのでチョット見づらいです。

  • Javaのバージョンを取得
  • System.out.println(System.getProperty("java.version"));
  • 作業ディレクトリを取得
  • System.out.println(System.getProperty("user.dir"));
  • すべてのプロパティを画面に表示
  • System.getProperties().list(System.out);
    -- listing properties --
    java.specification.name=Java Platform API Specification
    awt.toolkit=sun.awt.windows.WToolkit
    java.version=1.2
    java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
    user.timezone=Asia/Tokyo
    java.specification.version=1.2
    java.vm.vendor=Sun Microsystems Inc.
    user.home=C:\WIN95
    java.vm.specification.version=1.0
    os.arch=x86
    java.awt.fonts=
    java.vendor.url=http://java.sun.com/
    user.region=JP
    file.encoding.pkg=sun.io
    java.home=D:\JAVA\JDK1.2\JRE
    java.class.path=.;d:\java\jdk1.2\bin;
    line.separator=
    
    java.ext.dirs=D:\JAVA\JDK1.2\JRE\lib\ext
    java.io.tmpdir=C:\WIN95\TEMP\
    os.name=Windows 95
    java.vendor=Sun Microsystems Inc.
    java.awt.printerjob=sun.awt.windows.WPrinterJob
    java.library.path=D:\JAVA\JDK1.2\BIN;.;C:\WIN95\SYSTEM;...
    java.vm.specification.vendor=Sun Microsystems Inc.
    sun.io.unicode.encoding=UnicodeLittle
    file.encoding=MS932
    java.specification.vendor=Sun Microsystems Inc.
    user.language=ja
    user.name=no-ji
    java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
    java.vm.name=Classic VM
    java.class.version=46.0
    java.vm.specification.name=Java Virtual Machine Specification
    sun.boot.library.path=D:\JAVA\JDK1.2\JRE\bin
    os.version=4.0
    java.vm.version=1.2
    java.vm.info=build JDK-1.2-V, native threads, symcjit
    java.compiler=symcjit
    path.separator=;
    file.separator=\
    user.dir=E:\USERS\java\test
    sun.boot.class.path=D:\JAVA\JDK1.2\JRE\lib\rt.jar;D:\JAVA...
    
  • ファイルから読み込む。

  • 読み込んだ後のストリームはclose()する必要があります。書き込み時も同様。
    
        Properties prop = new Properties();
        InputStream in = null;
        try {
            in = FileInputStream("foo.properties");
            prop.load(in);
        }
        catch (FileNotFoundException ex) { ex.printStackTrace(); }
        catch (IOException ex) { ex.printStackTrace(); }
        finally { if (in!=null) in.close(); }
    
  • ファイルへ書き込む。
  • 
        Properties prop = new Properties();
        OutputStream out = null;
        try {
            out = new FileOutputStream("foo.properties");
            prop.store(out, "Title");
        }
        catch (FileNotFoundException ex) { ex.printStackTrace(); }
        catch (IOException ex) { ex.printStackTrace(); }
        finally { if (out!=null) out.close(); }
    
  • システムプロパティはコマンドラインから設定することが出来ます。
        System.out.println("UserID="+System.getProperty("UserID"));
    java -DUserID=Watanabe TestSystemProperties

    JDKのバージョンを調べる Edit

    javac -J-version

    JREのバージョンを調べる Edit

    java -version

    クラスファイルのバージョンを調べる Edit

    java のバージョンとクラスファイルのバージョン番号との対応は以下の通り。

    1.1 = 45.3
    1.2 = 46.0
    1.3 = 47.0
    1.4 = 48.0
    1.5 = 49.0

    クラスファイルのバージョンを調べるには、Unix では file コマンドを使うとよい。

    $ file xxx.class
    xxx.class: compiled Java class data, version 48.0

    file コマンドが使えない場合は、class ファイルの先頭 8 バイトを見れば分かる。
    class ファイルの 先頭 4 バイトは「CA FE BA BE」で固定である。続く、5 ~ 6 バイトがマイナーバージョン、7 ~ 8 バイトがメジャーバージョンを表している。
    ある class ファイルの先頭が以下だった場合、

    CA FE BA BE 00 00 00 30

    0x30 = 48 だから、JDK1.4 に準拠してコンパイルされた事が分かる。

    スタックトレースを文字列として取得する Edit

    /**
     * <code>e</code>のスタックトレースを文字列として取得します。
     *
     * @param e 例外およびエラー
     * @return <code>e</code>のスタックトレース文字列
     */
    public String getStackTraceString(Throwable e) {
     StringWriter sw = new StringWriter();
     PrintWriter pw = new PrintWriter(sw);
     e.printStackTrace(pw);
     pw.flush();
     String ret = sw.getBuffer().toString();
     pw.close();
     return ret;
    }
    

    http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi/free?page=%A5%B9%A5%BF%A5%C3%A5%AF%A5%C8%A5%EC%A1%BC%A5%B9%A4%F2%CA%B8%BB%FA%CE%F3%A4%C8%A4%B7%A4%C6%BC%E8%C6%C0%A4%B9%A4%EB

    16進ダンプ Edit

    grep Edit


  •     Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes