Dropbox

E61 キーボードの謎

NOKIA E61のキーボードをMIDPのプログラムから見た時の話です。

TextBox等の部品を使うとOSがキーボードの面倒を見てくれるので何も悩むことはありません。ゲームなどのプログラムでは、キーボードを押した時、あるいは放した時に発生するイベントで得られるキーコードを見て動作を決定します。KKJConvでは漢字変換時の操作性を考えるとOSの部品は使えずキーコードを見ながら自分で画面を描画するという方法を取ることにしました。

そこで最初にKKeyCodeCheckerというプログラムを作成し、キーコードを調査しました。いくつかキーを押してみて、愕然とするとともに、なるほどと思いました。「a」を押すと「a」のアスキーコードが返ってくるのに「b」を押すと「8」のアスキーコードが返ってくるのでした。7月2日の記事に写真を載せているので見ていただくと分かるのですが「b」のキーはキーボードの中央近くにあって「8」と共用になっているのです。つまり、電話のテンキーに相当する部分は、そのままテンキーのように振舞うデザインになっています。言い換えると電話のテンキー部分の両端にフルキーボードの残りの部分を取り付けたかのような構造になっているのです。

これは、考えてみると良く出来た構造です。今までの10キーを対象に作られたMIDPのプログラムは、そのまま動かすことが出来るからです。KanjiHelper等の10キーで日本語入力するMIDPプログラムが動作可能なのも、このためです。逆にKKJConvのようにフルキーボードとして使うためには、この部分のキーコードを自分で読み替える必要があります。

もうひとつ面白いのはシフトを押したままフルキーボードを押すと、それなりにキーコードが変化しすることです(そのくせシフトキー自体もキーコードを持っています)。シフト+「a」は「A」に相当するアスキーコードが返ります。またシフト+「1」だと「!」になります、これは英語キーボードに準じているように見えます。これも読み替えによって「!」だったら「R」と読み替えは可能です。Peek_DogさんやmaitomoさんがKKJConvのレポートで指摘されていることを直すには、この読み替えを行えば良いわけです。
ところが、ひとつ困ったことがあります。それは「8」のキーです。シフト+「8」では「*」に相当するアスキーコードが返ります。何故これが困ったことかというと「*」は別に存在するのです(電話だから当然です)。つまりシフトを押したままの状態でキーを押していくと「*」が2つの別のキーで返ってしまいます。つまり、その2つのキーがMIDPから見分けが付かないのです。

シフトを押したままの操作はKKJConvでは禁じてとするしかないみたいです。積極的に禁止するか、変な記号が入るけどサポート外ですとするか、、、悩ましい。

Trackback

16 comments untill now

  1. 開発ご苦労様です。
    キーコードの発効がそこまで特殊というか、電話に特化してたとは…..
    だから、Shift+ナンバーキーで数字のShift時の記号が出力されてたんですね。

    個人的には特殊記号が入力できるので現状のShift押しっぱなしはそのままの方がありがたいですね。(すでに馴れちゃってるというのもあるんですが)
    なので、禁止をするにしても有効、無効のスイッチが欲しいです。

  2. 大変よくわかりました。私個人的には、Sift同時押しでの入力はサポート外で、入力されてしまった文字や記号は自己責任で使用するという感じで良いです。同時押しでの入力を全て無効にするオプションがあると親切かもしれませんけれど。

  3. コザック @ 2006-07-05 20:50

    コメントありがとうございます。
    基本的には、そのままにしておきます。余力があればオプションの設置も検討します。他の記号入力をちゃんとするのがいずれにしても先決です。これもキートップの種類が多いので、徐々に対応します。

  4. スイマセン、検証のお役に立ってなくて。
    この三日間頭が割れてました。

    簡体字OSでのキーのマッピング、後日まとめて
    報告させていただきます(嫌がらせではございません

  5. コザック @ 2006-07-06 06:34

    Asukalさん、よろしく。MIDPのキーコード、あくまでOSが作り出しているものなのでE61のOSによる差異がないかどうかは、いずれ検証が必要と思っていました。
    お大事に、、、

  6. ここらへんが、E61日本語版は日本語入力をテンキーでサポートしている理由なのでしょうか?
    FEPモードではchrキーで記号の一覧がポップアップされますが、こういう機能をつけるのもひとつの手かも知れません。

  7. 例のちょっと気になる「あかさたな」が、こいうい理由だけとすると悲しいですね。
    記号のポップアップは最後の手段として検討中です。キートップを気にせずに唯一の方法ですものね。

  8. このスレッドと関係ないかも知れませんが・・・

    例えば「社員」と入力するときに「shain」ではうまく変換されず「shainn」まで入力する必要があります。これを「shain」で変換できるようにならないかなぁ~?
    要は最後尾の「ん」を「n」だけで認識して欲しいんですが。

  9. コザック @ 2006-07-06 16:20

    reveilさん、そうなるべきですね。たぶん、次にリリースに作り込めると思います。

  10. 宜しくお願いします。チュッ

  11. コザック @ 2006-07-06 18:56

    う、ごほっごほっ

  12. さきら @ 2006-07-07 10:30

    shiftキーの状態も取得できれば状況は改善できそうでしょうか。

  13. コザック @ 2006-07-07 12:36

    さきらさん、どうもです。
    Shiftステータスは、Shiftのキーコードが見えるので自前で管理可能です。本文に書き忘れましたが「*」はShiftを押しても押さなくても「*」を返します。これがシフト時は別コードになれば良いのですけどね。

  14. ひよこ @ 2006-07-08 12:29

    E61衝動買いしてしまいました。 漢字変換はすばらしいですね。 多謝。 しかし変換できません。 MIDPが2.0だと何か問題ありますか? □□□になってしまいます。
    ちなみにGetPropertyはちゃんと動きます。
    Encording:ISO-8859-1
    Platform:NokiaE61-1/0610.04.04
    Locale:en
    Configuration:CLDC-1.1
    Profiles:MIDP-2.0
    になっています。

  15. コザック @ 2006-07-08 12:41

    ひよこさんのE61は、ひょっとして英語版ですか? そうだとすると「かな」も入らないです。その場合、まず日本語を表示できるフォントを導入しないといけないです。
    http://d.hatena.ne.jp/Peek_Dog/ さんなどが日本語フォントの話を以前書かれています。

  16. ひよこ @ 2006-07-08 23:40

    ありがとうございます。 英語版のようです。フォントを導入しよう試みたのですが、SDKには手が出ず今だ日本語化できません。そうそう、KKJConv.jarの前に?マークが付いています。他のファイルは黄色いマークになっていますが良いのでしょうか? V0.62に入れ替えました。

Add your comment now