雑学講座 番外編 第一回

Enc?***の解説

第五回をなかなか書かないうちに、番外編です

今(2004年4月)、T-PilotのBBSで紹介しているEnc?***の解説をしておこうかと

http://www5f.biglobe.ne.jp/~T-Pilot/PalmWares/Enc_/

なにをやっているか解らないと気持ち悪いですものね

まず簡単なところから

その1 Enc?SwDA

これは簡単 その名のとおり単なるスイッチです
Enc?Hackが動作してよいか駄目かの情報を設定しています

具体的には、クリエータID:'Enc?'、番号:#0のフィーチャを'true'か'false'に設定です

フィーチャというのは、だれでも参照できる設定と捉えて下さい

Enc?Hackのほうを、クリエータID:'Enc?'、番号:#0のフィーチャを見て、'true'だったら動作、'false'だったらなにもしないように書いていますので、Enc?DAの動作はこれだけ

その2 Enc?ToJisDA

これも単純 今編集中のフィールドを探して、そこに書かれている文字列をJISエンコード(JISコードの文字列+エスケープシーケンス)に直すだけ

フィールドとは、Memoなどでおなじみの文字を入力するエリアです

そうそう、PalmはShiftJIS、MacやUNIX系はEUC、Windowsは表面上はShiftJISエンコードです

W2kとXPは内部処理はunicodeだそうです

なぜ、このDAが必要かというと、WebProに余計なエンコーディングをさせないためなのです

一般的なブラウザはページのエンコードに合わせて情報を送信するのですが、WebProは日本語を想定していないので、7ビットの範囲に収まっていない文字についてはよく解らないエンコード変換を行って送信してしまいます
ただ、幸いなことに、文字列が全て7ビットの範囲(ASCII)であればなにもせずにそのまま送ってくれています

さて、ここで、ポイントとなるのが、JISエンコードは全て7ビットの範囲に収まっているということなのです

8ビット半角カナ文字はのぞいて
蛇足:EUCとShiftJISは8ビットまるまる使っています

ということは、送信したい文字列をJISエンコードに変換しておけば、WebProは変更を加えずにそのまま送信してくれるというわけ

後は、受け取る側がJISエンコードを解釈してくれれば「万事上手く行く」こととなります

WebProで、例えばExciteの検索ページを開いて下さい( http://www.Excite.co.jp )
検索文字を"T-Pilot"とするときちんと検索してくれますが、"エンコーディング"なんて検索させようとしてもきちんと検索してくれませんね

では、"エンコーディング"と入力してからEnc?ToJisDAでJISエンコードに変換してから検索させてみて下さい

こんな感じ"$B%(%s%3!<%G%#%s%0(B"
どうですか?うまくいったでしょう

そうそう、このEnc?ToJisDAは単体で動作しますので、”EUCかJISのページは見ないよ”という場合はこのDAだけで十分でしょう

はあ、長くなりました
次は本題のEnc?Hackの動作です

その2 Enc?Hack

これはとっても複雑... いくつものAPIをトラップしています

APIについての解説は別の機会にしましょう。ここではOSが用意してくれている便利なツールと思って下さい

ひとつめ

StrLen ”何文字?”

渡された文字列が何文字かを答えてくれるツールです String Length という意味でしょうね

Enc?Hackは、渡された文字列がJISかEUCかShiftJISかASCIIかを判定して、必要であればShiftJISに変換した文字列を作成し、本来のStrLenツールに渡します

細かいことは省きますが、なにもしないと特に問題となるのがJISのばあいですね
文字列中に”表示しない約束”の文字(エスケープシーケンス)をいっぱい含んでいますので、表示したい文字数と実際の文字列の長さに差が出てしまいます

エスケープシーケンスというのは、次から日本語だよ、次から英文字だよ、次から半角のカナだよというように次からの文字列の種類を教えあげる符号です

つぎ

WinDrawChars ”文字列を描いてね”
WinPaintChars ”上とおなじようなこと”
WinDrawInvertChatrs ”略”
WinInvertChars ”略”

これらは、渡された文字列を画面上に描いてくれるツールたちです

Enc?Hackの動作はStrLenとほぼ同じですので説明は省きますが、必要であればShiftJISに変換した文字列を作成し、本来のツールに渡します

ポイントは、単に描画する文字列をすげ替えているだけで、もともとの文字列には変更を加えていないということです

さらにつぎ

FntCharsWidth ”文字列の幅はどのくらい?”
FntCharsInWidth ”この幅に何文字書ける?”
FntLineWidth ”うまく説明できないな”
FntWordrap ”これも”

主にフォントに関する情報を教えてくれるツールです

大きい字と小さい字では、文字の幅が違いますよね
当然、同じ幅に収まる文字数も

これも、単にツールに渡す文字列をすげ替えているだけで、もともとの文字列には変更を加えていないということがポイントです

さてさて、次はちょっと違います 最後なのでがんばって

と、ここまできて気がつきました、あまりニーズがないのでは?
いや、ほんとうにあまり無いですね XiinoのOS5対応版も出てますし....

まあ、せっかくなので続けましょう

続き

FldSetText ”フィールドに文字列をセットします”

これだけは、渡された文字列データそのものに変更を加えます

フィールドとは、Memoなどでおなじみの文字を入力するエリアですので、文字列に追加、変更が加わることを想定しなければいけません

例えば、Memoを開くときは、表示したい文章をデータベースから探してきて、その文章データの所在をフィールドに教えてあげる、というようにMemoはプログラムされています

Memoでの文章入力時は画面いっぱいがフィールドですね

あとの処理はOSが受け持ってくれますので、とにかく正しいShiftJISの文字列を渡してあげることに専念します

ここで、ちょっと考えてみましょう

例えばMac上で入力した文章が、きちんとShiftJISに変換されずにPalm上に転送されてしまっていたら?

MacはEUCエンコードなので、文章もEUCでPalm上に存在してしまいます

描画の手当だけでは、Palm上で文章に修正を加えたらどうなるでしょう
文章データはもとのEUCコードのままなので、そこにShiftJISの文字列が紛れ込んでしまいますね

こうなったら元に戻すのは大変です

そこで、このHackの出番
もともとの文章のエンコードを判断して、もともとの文章そのものを一気にShiftJISに変換してしまいます

いったんShiftJISに変換してしまえば、もう大丈夫
後は本来のツールに情報を渡してあげてOSに処理を任せるというわけ

なんとなくおわかりですか?

この機能の必要性を具体例をあげてみましょう

WebProでBBS等への投稿を後で修正することを想像して下さい
画面上のフィールドに以前入力した文章が予め表示されていますね
EUCエンコードのページでは、この予めフィールドに表示しておく文章もEUCエンコードのデータとして送られてきます

ここにPalm上で変更を加えたら?

Memoの例と同様EUCの文章にShiftJISの文字列が紛れ込んでしまいます
そうならないように、このフィールドに渡される文章を調べて前もってShiftJISに変換しておくことが必要になるわけです

そうそう、せっかく編集したので、送信するときは必ずEnc?ToJisDAでJISエンコードに変換するのを忘れないように

WebProに余計なエンコーディングをさせないために

このFldSetTextをオーバリッドする機能はどこでも効きますので、もしかするとMacを母艦にしている環境で、Palm@sjisなしでも行けるかもしれません
ただ、データベースに変更を加える場合は確認のダイアログを表示するようにしているのでちょっとうっとうしいかもしれませんね

どうでした?

工夫次第でいろんな使い方のできるツールです

例えば、VersaMailで日本語メールを読むこともなんとかできますよ

そろそろ、雑学講座も再開しないといけませんね
Hack系プログラマ向けの雑学講座を書いたりしていたので途中で止まっていました(PHSの連載講座用)
ただ、とてもお行儀の悪いコーディングの話なのでPHSでは公開できないかも?
そのうち、こっちで紹介することになったりして...