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

英語モデルの内蔵キーボードを日本語106/109キーボードに変更

2008-04-14 02:23:21 | Windows

OS およびハードウェアを含めて英語モデル Windows XP を使用している。
しかし、自分は英語キーボードが苦手である。@マークが Shift+2 という時点で自分には入力しずらくて仕方がないのであるが、英語キーボードになれている方々からすればなんのことはない慣れなんだろう。

とにかく、自分は英語配列が NG なため、先日まで「窓使いの憂鬱」を使って対応していた。

が、キーがそもそも足りないので、カッコの割り当てが足りなくなってしまった。

あまりにも使いづらいので、日本語内蔵キーボードを取り寄せてもらった。取り付けは無事完了し、起動も OK。レジストリもいじってみたが。。。

あれ、配列が変わりません。うーん、うーんと試行錯誤したところ、3つほどレジストリエントリを変えないといけないことが判明。そのまとめ。

レジストリキー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

  LayerDriver JPN = kbd106n.dll (String Value)
  OverrideKeyboardIdentifier = PCAT_106KEY (String Value)
  OverrideKeyboardSubtype = 00000002 (dword Value)
  OverrideKeyboardType = 00000007 (dword Value)

上記の値のように英語 Windows XP の値を変更してあげれば日本語キーボード配列として認識されるようになるみたい。