ispell にスペルチェックと文字列の置換No.02135
ひろ さん 01/05/04 01:05
 
 皆さんさん、今日は、ひろです。hidesoft.8:01403 へのレスです。

 kendo さん、まず hidesoft.2:08590 のスレッドで解決済みだと思いますが、maruo.
exe と hidemaru.exe は、メニューが英語か日本語化の違いだけなので、別けて使う必
要はありません。単に表示フォントを変更すれば済みます。
> 1.まずアルファベットにtexのテキストみたくタグをつけるのです。
<中略>
> 2.例をフランス語で続けましょう。フランス語用の元辞書(francais.dic)を
> WebでDLしてきて、
<中略>
> この辞書はテキストファイルなのです。この文字を"c1"で一
> 括変換してしまいます。以下、他のものも同じです。
<中略>
> 3.buildhashという実行ファイルでispellで使用するバイナリーの辞書ファイ
> ルを作成します。ただし、buildhash.exeに作成上のオプションを与えるファイ
> ルにfrancais.affというのがありますが、これもテキストファイルで。maruoな
> どで開いて同じようにフランス語固有の文字を、さっきの"c1"のようにすべて置
> 換してしまいます。
<中略>
> 4.出来上がったバイナリのフランス語用辞書をひろさんのマクロで立ち上げる
> ようにします。もう辞書には一切フランス語固有の文字は含まれていませんから、
> 日本語にフランス語文字が入っていても問題ありません。
<中略>
> 5.チェックが済んだら、今度は「"franc2ais"などとあるのを秀丸の一括置換
> のマクロを作って、フランス語に戻せば......」ということ
<中略>
> 6.maruoなどでフランス語のみで日本語に混ぜずに書けば、それをひろさんの
> マクロを立ち上げてチェックして、さらにmaruo(英語版秀丸)で何かの一括置
> 換マクロと使って純正のフランス語表記に直せます。
 なるほどこうすればある程度は、スペルチェックと英語以外の処理が出来
そうですね。

 スペルチェックは何度もやるかもしれないので、置換部分だけマクロ化す
ればよいですね。単純にアルファベットと数字によって ASCII 文字以外の
西欧文字を表しているなら、次のような要領のマクロで実現できます。
//ASCII 文字以外の西欧文字に置換するマクロ
//*******検索状態を保持
#reg_search=searchmode;
writeininum "hidemaru.ini","Env","SelectFound",1;
envchanged;
$search=searchbuffer;
#search=searchoption;

##x = x;
##y = y;
disabledraw;
goscreentop;
##sctop = y;
gofileend;
while( 1 ){
  searchup "[A-Za-z][0-9]",regular;
  if( !result )break;
  call getChar gettext(seltopx,seltopy,selendx,selendy);
  if(strlen($$return) != 0){//何故か if($$return != "") で判定不可
    delete;
    delete;
    insertfix $$return;
  }
}

//******検索を初期状態に戻す
if(!#reg_search){
  writeininum "hidemaru.ini","Env","SelectFound",#reg_search;
  envchanged;
}
setsearch $search, #search;
enabledraw ##sctop;
moveto ##x,##y;//なるべくマクロ開始時の表示に近づける
endmacro;


getChar://設定した文字との対応
  if( $$1 == "c2")return "\xE7";//これは髭付きの小文字 c
  //以下 else if で同様の設定、
  //\x の後の数字は、秀丸で「文字コード表示」を使えばよい。
  //上記の例の場合、Shift-JIS に「0xE7」と表記されるはず
  else return "";//設定が無い場合の処理

[ ]
RE:02135 ispell にスペルチェックと文字No.02141
kendo さん 01/05/04 13:48
 
 ひろさん、ご指導ありがとうございます。お世話になります。
交換室が変わりましたが、よろしくお願いします。

マクロの次の部分について教えてください。

>getChar://設定した文字との対応
>  if( $$1 == "c2")return "\xE7";//これは髭付きの小文字 c
>  //以下 else if で同様の設定、
>  //\x の後の数字は、秀丸で「文字コード表示」を使えばよい。
>  //上記の例の場合、Shift-JIS に「0xE7」と表記されるはず
>  else return "";//設定が無い場合の処理
 文字コードを表示させるのが結構私の場合不慣れで失敗しそうなので、英語フォン
トにしておいて、たとえば \xE7 にいきなりそのまま「髭付きの小文字 c」のフラ
ンス語で使う文字を張り付けてもよいのでしょうか。(以下同様に、コード番号では
なくてフランス語などの特殊文字で処理。)

(素朴な質問ですが、Shift-JIS でも半角でフランス語などの記号付き文字は表示で
きますでしょうか。ちゃんと勉強してないので、文字コードのことあまりよく分かり
ません。お手数おかけします。)

[ ]
RE:02141 ispell にスペルチェックと文字No.02145
ひろ さん 01/05/04 23:31
 
 kendo さん今日は、ひろです。
>  文字コードを表示させるのが結構私の場合不慣れで失敗しそうなので、英語フォン
> トにしておいて、たとえば \xE7 にいきなりそのまま「髭付きの小文字 c」のフラ
> ンス語で使う文字を張り付けてもよいのでしょうか。
 止めておいた方がよいです。秀丸のマクロは内部的にには Shift-JIS で
扱っているので、「"」で文字列を括る判定が上手く働かない可能性があり
ます。

> (素朴な質問ですが、Shift-JIS でも半角でフランス語などの記号付き文字は表示で
 フランス語で Shift-JIS というのがそもそも変ですが(^^;、
「hidesoft.4:02135」にて
>  maruo.
> exe と hidemaru.exe は、メニューが英語か日本語化の違いだけなので、別けて使
>う必
> 要はありません。単に表示フォントを変更すれば済みます。
と書いたように、表示フォントさえ変更すれば問題ありません。
 欧文の文字は全て 8 ビットで納まるので、EUC として保存しても同じで
す。ただし JIS として保存してしまうと、半角カタカナと同じコード番号
になる部分は全角カタカナに変換されて保存されるので、上手くいきません。

[ ]
RE:02145 ispell にスペルチェックと文字No.02146
kendo さん 01/05/05 00:19
 
ひろさん、詳しくご説明ありがとうございます。
maruoもそれなりに好きなので使っていくたいとは思っています。

[ ]
RE:02135 ひろさん、ispell についてですNo.02153
kendo さん 01/05/06 09:28
 
ひろさん、こんにちは。
hidesoft.8:01396と関連しての考えです。

 さて、数字と組み合わせてフランス語やドイツ語を表記して、それを日本語まじり
の文章中でもそのままでispellでチェックすることの段取りを説明し、最終的な置換
マクロをひろさんに教えていただきました。その後、あることに気づきました。

 私が英語版(正確には英語フォントにした)『秀丸』で、ispellのDLしてきたフ
ランス語の元辞書を開いて、それでフランス語がふつうに表示されていたという報告
をしました。ということは、この元辞書のテキストファイルは、windowsのansiコー
ドで書かれているいうことです。
 ちなみに英語DOSプロパーのdosのテキストエディタ(身近なものではVZエディタ
におまけでついてくる『VZUS』というものがあります。これは日本語DOSでは動きま
せん。)を立ち上げてこのファイルを読むと、アクセント文字の部分が「文字化け」
していて(というか本来想定している形に表示されず)、フランス語が読めません。
ispellがdos環境で利用するためのものとしたら、なぜあらかじめwindowsの文字セッ
トのコードになっていて、dosで読めないのかというのが、ず不思議に思います。

 ひろさんのispellのマクロではwindowsの画面(秀丸の画面)の文字をdos窓に送っ
てそこでチェックを行うわけですが、英語の場合は問題なくても、フランス語などで
はアクセント文字などの部分は、windowsの文字セットといわゆるIBMコード(437
コードページ)ではずれていますので、英語フォントの秀丸の文字をdos窓に送ると
「文字化け」してしまいます。(ためしに英語フォントの秀丸上でansiコードをIBM
コードに置換して――そうなるとwindows上ではとりあえず「文字化け」しています
――、それからispellのマクロを立ち上げると、dos窓に送られた文字はansiコード
のときに見えていたフランス語の表記になります。)

 つまり、英語フォントの場合、
        windowsの表記、ansiコード
                dos窓の表記、IBMコード
となり、もともとちぐはぐなのです。さらにこれに加えて、dos窓で動かすはずのisp
ellのフランス語辞書がansiコード用となっています。

 こういう操作ができるのかどうかわかりませんが、ispellを英語以外の西欧語で
『秀丸』マクロと併せてつかうには、理屈の上ではつぎの二つの方向があるようにお
もいます。

  1.dos窓のispellを動かすとき、ansiコードで文字セットを設定する。(こん
なこと可能なのでしょうか。dos窓はwindowsのプログラムの一部なのですから、文字
セットはwindowのものを使えるのでしょうか。)

  2.ispellのフランス語辞書のコードをIBMコード用に置換する。
 windowsから文字情報をdosに送るとき、「フィルター」のような置換のしくみを通
してansiコードをIBMコードに変えて、それをdos窓で表示する。dos窓上のispellで
のチェックが終えたら、windows(英語フォント秀丸)上のansiコードのテキストを
上書きするときに、再度、逆方向の「フィルター」でdos窓上の直されたテキストのI
BMコードをansiコードに戻して上書きする。
 こうした「フィルター」のような操作はispellにoptionを与えたりしただけでは無
理なような気がします。

 以上がispellをなるべく本来の形のまま『秀丸』から用いるやりかたの一つかなな
どと思っておりますが、ちょっと面倒な感じがいたします。
 ということで、日本語まじりでもフランス語などがチェックできる私のやり方、自
分としては実用的だと思っております。
 テキストの最終仕上げは、『秀丸』の中でというよりもワープロを用いましたら、
もともとの表示フォントが日本語であるとか英語であるとか気にする必要がありませ
ん。(日本語混じりの英語を『秀丸』で処理すると、フランス語を表記するためには
日本語が表記できません。もちろん最初から英語フォントの『秀丸』でフランス語の
みを書くならものなら問題はないわけすが。)


[ ]
RE:02153 ひろさん、ispell についてですNo.02154
ひろ さん 01/05/06 23:38
 
 kendo さん今日は、ひろです。
 文字コードについての表記について、それが正確であるかの議論は飛ばし
ます。

> ispellがdos環境で利用するためのものとしたら、なぜあらかじめwindowsの文字セッ
> トのコードになっていて、dosで読めないのかというのが、ず不思議に思います。
 違います。ispell は DOS の環境で利用するために開発されたソフトウェ
アではありません。色々なプラットフォームでの動くように考慮されたソフ
トウェアです。
 この様な表現が正確であるかどうか解りませんが、Windows のターミナル
ソフトである DOS 窓は、Windows のシステムフォントしか利用できないよ
うです。そのため日本語 Windows では日本語表記しか考慮されておらず、
フランス語などの表記が出来ないのだと思います。要するに ispell の問題
ではなく、Windows 側の制限による問題です。

>  ひろさんのispellのマクロではwindowsの画面(秀丸の画面)の文字をdos窓に送っ
> てそこでチェックを行うわけです
 これも違います。秀丸の表示画面を送っているのではなく、秀丸で開いて
いるファイルを ispell でも開いているだけです。ですからファイル名が付
いていないと動きませんし、付いていても編集されていれば、保存してから
ispell を起動します。

> はアクセント文字などの部分は、windowsの文字セットといわゆるIBMコード(437
> コードページ)ではずれていますので、英語フォントの秀丸の文字をdos窓に送ると
 この 437 コードページって、文字コードで言うとどの辺りでしょうか?
もし 0xFF 以上の 8 ビットで収まらない部分のことでしたら、
>  つまり、英語フォントの場合、
>         windowsの表記、ansiコード
>                 dos窓の表記、IBMコード
となるのは当然です。

 ただし ispell の起動前後に文字列を置換することは可能ですので、
「hidesoft.4:02135」のマクロを参考に、置換するマクロを作成してみてく
ださい。変更すべき部分は、searchup とサブルーチン getChar のコード対
応の部分のみです。

[ ]
RE:02154 ひろさん、ispell についてですNo.02155
kendo さん 01/05/06 23:51
 
ひろさん、コメントありがとうございます。

> 違います。ispell は DOS の環境で利用するために開発されたソフトウェ
>アではありません。色々なプラットフォームでの動くように考慮されたソフ
>トウェアです。
> この様な表現が正確であるかどうか解りませんが、Windows のターミナル
>ソフトである DOS 窓は、Windows のシステムフォントしか利用できないよ
>うです。そのため日本語 Windows では日本語表記しか考慮されておらず、
>フランス語などの表記が出来ないのだと思います。要するに ispell の問題
>ではなく、Windows 側の制限による問題です。
 しかし、dos窓でもchevコマンドができますから、英語フォントでの表記は可能だ
とおもいますが。実際に、usコマンドで英語dosにするとvzusが使えます。


>>  ひろさんのispellのマクロではwindowsの画面(秀丸の画面)の文字をdos窓に送っ
>> てそこでチェックを行うわけです
> これも違います。秀丸の表示画面を送っているのではなく、秀丸で開いて
>いるファイルを ispell でも開いているだけです。ですからファイル名が付
>いていないと動きませんし、付いていても編集されていれば、保存してから
>ispell を起動します。
 了解しました。私の勘違いでした。

>> はアクセント文字などの部分は、windowsの文字セットといわゆるIBMコード(437
>> コードページ)ではずれていますので、英語フォントの秀丸の文字をdos窓に送ると
> この 437 コードページって、文字コードで言うとどの辺りでしょうか?
 文字セット全体をこの様な番号で整理しているようです。dosとwindowsでは文字セ
ットが違いましたですよね。

 私は勉強不足でもいろいろ勘違いがあるかとおもいますが、失礼がありましたらお
許しください。




[ ]
RE:02155 ひろさん、ispell についてですNo.02156
kendo さん 01/05/06 23:55
 
自己レスです。
> しかし、dos窓でもchevコマンドができますから、英語フォントでの表記は可能だ
>とおもいますが。実際に、usコマンドで英語dosにするとvzusが使えます。
 実際にやってみますと、chevは使えませんでした。訂正します。しかし、usは有効
でした。

[ ]
RE:02156 ひろさん、ispell についてですNo.02157
ひろ さん 01/05/07 18:12
 
 kendo さん今日は、ひろです。
>  実際にやってみますと、chevは使えませんでした。訂正します。しかし、usは有効
> でした。
 それでは us コマンドではなく、最初からこのモードで起動できるオプショ
ン等があれば上手くいくのですが...。またバッチファイル経由だと操作性
が今一つです。

[ ]
RE:02135 ispell にスペルチェックと文字No.02166
ひろ さん 01/05/13 12:18
 
 秀丸担当さん今日は、ひろです。
>   if(strlen($$return) != 0){//何故か if($$return != "") で判定不可
<中略 (以下部分的にも略)>
> getChar:
>   if( $$1 == "c2")return "\xE7";//これは髭付きの小文字 c
>   //\x の後の数字は、秀丸で「文字コード表示」を使えばよい。
>   else return "";//設定が無い場合の処理
へのレスを頂けませんか? バグか使用か解りかねています。

[ ]
RE:02166 ispell にスペルチェックと文字No.02167
秀丸担当 さん 01/05/14 18:25
 
>> if(strlen($$return) != 0){//何故か if($$return != "") で判定不可
><中略 (以下部分的にも略)>
>> getChar:
>> if( $$1 == "c2")return "\xE7";//これは髭付きの小文字 c
>> //\x の後の数字は、秀丸で「文字コード表示」を使えばよい。
>> else return "";//設定が無い場合の処理
>へのレスを頂けませんか? バグか使用か解りかねています。

これは、2バイト文字しか考慮していないためで、バグと考えてもらって
かまいません。

ようはWindowsAPIをそのまま使っているだけの話ですが。
lstrcmp("\xE7","") が 0 を返すのに lstrlen("\xE7") は 1 を返す
のが変でした。

[ ]
RE:02167 ispell にスペルチェックと文字No.02168
ひろ さん 01/05/14 19:16
 
 秀丸担当さん今日は、ひろです。
> ようはWindowsAPIをそのまま使っているだけの話ですが。
> lstrcmp("\xE7","") が 0 を返すのに lstrlen("\xE7") は 1 を返す
 使用している言語にもよるのでしょうが、Win32API の仕様がおかしいん
ですね。基本的にはマクロを書くのはヘビーユーザーでしょうから、仕様と
して頂いてヘルプに但し書きをして頂くだけでも構いません。

[ ]