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

正規表現 Edit

実行環境・ツール Edit

その他 Edit

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