Lunatic Sol

IT Tips

Notes Java で SJIS 範囲外の文字を取得するには?

2008-04-30 20:09:38 | Notes Java
Notes Java で日本語と英語以外の文字 (SJIS 範囲外) を取得しようとすると、ことごとく失敗してしまう模様。7.0 なので、バージョンの問題ならハッピーなんだけど。

例えば、Notes DB タイトルが以下のような韓国語だとする。

서울

LotusScript で以下のように実行すると、ステータスバーに正しい文字が表示される。


Sub Initialize
    Dim s As New NotesSession
    Dim db As NotesDatabase
    Set db = s.GetDatabase("server/domino","unicode.nsf")
    Print db.Title
End Sub


しかし、以下のように Java Agent で実行した場合には ?? と出力されてしまう。


import lotus.domino.*;
import java.io.*;
public class JavaAgent extends AgentBase {
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();
            String servername = "server/domino";
            Database db = session.getDatabase(servername,"unicode.nsf");
            System.out.println(db.getTitle());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}


Windows 上なので、Java コンソールが Windows-31j にセットされている可能性もあるので、byte を使って以下のようにアレンジしてみたけれど、ことごとく 0x3F で表示されてしまいます。。。

Notes Java Agent でなくて、外部 Notes Java プログラムにしても同じだし、Stream オブジェクトを使って、Charset を UTF-8 にしておいても同じ。

むぅ、これって Notes Java のバグじゃないのかなぁ。Unicode で扱うべきメソッドが、getTitle() メソッドを Call した時点で System Locale の Charset で扱ってしまっているような気がするんだけど。。。


import lotus.domino.*;
import java.io.*;
public class JavaAgent extends AgentBase {
    public void NotesMain() {
        try {
            Session session = getSession();
            AgentContext agentContext = session.getAgentContext();

            String servername = "server/domino";
            Database db = session.getDatabase(servername,"unicode.nsf");
            
            byte bdbTitle[] = db.getTitle().getBytes();
            
            ByteArrayInputStream bsdbTitle = new ByteArrayInputStream(bdbTitle);
            InputStreamReader isdbTitle = new InputStreamReader(bsdbTitle);
            
            int ch;
            while ((ch = isdbTitle.read()) != -1) {
                System.out.print("0x" + Integer.toHexString(ch).toUpperCase() + " ");
            }
            isdbTitle.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}




全部 63