Skip to content

Latest commit

 

History

History
88 lines (62 loc) · 5.03 KB

2023-04-09.md

File metadata and controls

88 lines (62 loc) · 5.03 KB

2023-04-09

こんにちは!!!

進捗報告。 未確定文字列ウィンドウと候補ウィンドウの表示に関する ReactOS PR #5226 がマージされた。

mzimejaのユーザー辞書と郵便番号変換が実装された。 詳しくはmzimejaのHISTORY.txtを見てくれ。 これで日本語入力プロジェクトは80%達成。コマンドプロンプト以外の日本語入力はほぼ実現した。

前回の課題について。ECImeComposition内部のImmNotifyIME呼び出しは2個ある。周辺を解読すると:

HIMC hIMC = ImmGetContext(...);
ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0);
NtUserCallOneParam(MB_ICONWARNING, ONEPARAM_ROUTINE_MESSAGEBEEP);
ImmReleaseContext(..., hIMC);

NtUserCallOneParamのところは、警告の効果音を出しているようだ。 「CPS_CANCEL」の部分は、未確定文字列をキャンセルしているように見える。 これは何かに失敗もしくはキャンセルされたときの処理のように見える。 (実際にmzimejaのCPS_CANCELを見ると、未確定文字列をキャンセルしている)

話は変わるが、情報サイト「猫でもできるWindows」とか「Eternal Windows」などにはシフトJISを前提としたサンプルソースがある。 日本語ネイティブに対応していないコンパイラでSJISを前提としたソースコードをコンパイルするには、ちょっとした工夫が必要だ。 具体的には、コードページ932を指定する。指定の方法はコンパイラによって異なる。

昔、Borland C++という無料のコンパイラがあってそれはそのまま日本語ネイティブのソースコードに対応していた。 新しめのgcc/g++/clangでシフトJISのソースをコンパイルするには、コマンドラインオプションに「-finput-charset=cp932 -fexec-charset=cp932」を付ける。 RosBEのgcc/g++ではシフトJISのソースはコンパイルできない。 シフトJISのリソースをコンパイルするには、最初の方に「#pragma code_page(932)」を追加するか、全部UTF-8にして「#pragma code_page(65001)」を付ける。 日本語ではないVisual StudioでシフトJISのソースをコンパイルするには「/source-charset:cp932」を指定する。

CMakeでSJISをやるんだったら

# シフトJIS対応。
if(MSVC)
    add_compile_options(/source-charset=cp932)
else()
    add_compile_options(-finput-charset=cp932 -fexec-charset=cp932)
endif()

MSVCにおいてコメント内でSJISとUTF-8が混在しているときはさらに「/validate-charset-」を指定する。

さて、日本語入力の実現においては国語の知識も使います。エンジニアや研究者には「私は文系だから~」「私は理系だから~」などと言っている暇はありません。 理系でもドキュメントは書きますし、言語学もやります。****さんは、国語で「動詞の活用」とか「形容詞の活用」とか習いましたか?

ええ、知ってます

コンピュータでは上一段動詞と下一段動詞をまとめて「一段動詞」として扱う。 終止形が「い」で終わる形容詞は「い形容詞」と呼び、終止形が「な」で終わる形容詞は「な形容詞」と呼ぶ。 つまり「大きい」は「い形容詞」。「大きな」は「な形容詞」。 mzimejaでは、品詞の種類をenum HinshiBunruiで表している。

ちょっと辞書データを見てみましょう。mzimejaのres/mzimeja.datをサクラエディタで開いて見て下さい。これが基本辞書のデータです。 これがdict_compileプログラムでコンパイル・圧縮されてres/mzimeja.dicとなる。 res/mzimeja.dicを開いてみて下さい。ずらっとUTF-16のテキストが表示されるだろう。 このようなデータを「バイナリ辞書形式」と呼ぶことにする。

分かりにくいかも知れないが、WCHAR単位でデータが並んでいて、U+FFFDがレコード区切りで、U+FFFCがフィールド区切りになっている。 「レコード」(record)というのは、データベースの中の1件のデータを意味する。表計算では1レコードは一行のデータ。 「フィールド」(field)はレコードをさらに分解したものだ。 dict_compile/dict_compile.cppを読めばどのように辞書データを圧縮しているかがわかるだろう。

【課題】次の画像に載っている動詞の活用形が正しく変換されるか確かめて下さい。

(画像略)

(これはツイッターで拾った画像です)

【課題】ImeStudy #19 と #20 を解決してほしい。ターゲットソースは、mzimejaのime/convert.cpp。

今日はここまで。

なるほど、頑張ってみます!


戻る | 次へ