全角での文字数をカウントしたいNo.22844
彗星 さん 07/04/06 10:13
 
はじめまして。秀丸を愛用しています。
かつ、マクロライブラリのマクロを、いくつも使わせていただいています。マクロ作
家のみなさま、ありがとうございます。

私はライターをしているのですが、よく「○○文字で」というオーダーで仕事をいた
だきます。
指定の文字数に納まるように書くのですが、この指定文字数は「全角」でカウントし
た場合の文字数です。

そこで、文字数をカウントするマクロをいろいろ使っているのですが、全角と半角で
それぞれカウントして合計するものなどあり、なかなか思う結果が得られずに困って
います。

・指定した範囲、あるいは全文で
・全角で何文字なのかカウントしたい
・半角の文字が混じっている場合は、「2文字で全角1文字」とカウントする
・半角の文字が奇数の場合は、切り上げて(半角3文字なら全角2文字分)カウントする

こんな条件にあうマクロはないでしょうか?

会議室が違っていたら、すみません。
どうぞよろしくお願いいたします。

[ ]
RE:22844 全角での文字数をカウントしたいNo.22848
秀丸担当 さん 07/04/06 16:47
 

>そこで、文字数をカウントするマクロをいろいろ使っているのですが、全角と半角で
>それぞれカウントして合計するものなどあり、なかなか思う結果が得られずに困って
>います。
>
>・指定した範囲、あるいは全文で
>・全角で何文字なのかカウントしたい
>・半角の文字が混じっている場合は、「2文字で全角1文字」とカウントする
>・半角の文字が奇数の場合は、切り上げて(半角3文字なら全角2文字分)カウントする

そういったマクロを作られている方もいそうな気がしないでもないですが、この
要件を完全に満たすとなると、わからないです。

特に半角奇数を切り上げというのは、作られている方はいないかもしれません。
半角奇数切り上げはマクロを作らなくてはいけないかもしれないです。


要件を満たしてはいないですが、V6.00以降では、ステータスバーに概ねの文字
数を表示できるようになりました。
[その他]→[動作環境]→[ウィンドウ]のステータスバーのところか、ウィンドウ
下に表示されているステータスバーを右クリックして、表示内容を変更できます。
ここで「全体の文字数(おおよそ)」と「範囲選択の文字数(おおよそ)」を表
示させることができます。
ただし半角1文字は1文字、全角1文字は2文字、改行は2文字、Unicode独自
文字は4文字とカウントされてしまうのであまりあてにならないです。

[ ]
RE:22844 全角での文字数をカウントしたいNo.22850
Iranoan さん 07/04/06 19:47
 
 彗星さん今日は、Iranoan です。
> ・指定した範囲、あるいは全文で
> ・全角で何文字なのかカウントしたい
> ・半角の文字が混じっている場合は、「2文字で全角1文字」とカウントする
> ・半角の文字が奇数の場合は、切り上げて(半角3文字なら全角2文字分)カウントする
>
> こんな条件にあうマクロはないでしょうか?
 あるかどうかは解りませんが、作ることは可能でしょう。ただ細かい仕様
(希望動作) は、使う人でないと解りませんからね〜。ここでの仕様とは、
・半角の 2 文字で全角 1 文字は、
  o 連続しているときだけ
  o 全体か
  のどちらなのか?
・句読点、括弧などはどの様に扱うのか?
等です。改行と全半角の空白だけをカウント対象としないマクロのサンプルは
次のようになります。重要なのは、2 つ目のブロック (第 2 段落) だけで、
後は初期状態に戻すための処理です。
//--------------------------------------------------------------------
disabledraw;
#x = x;
#y = y;
$s = searchbuffer;
#s = searchoption;
$h = foundbuffer;
#h = foundoption;
#f = foundhilighting;

if( !selecting )selectall;
moveto seltopx, seltopy;
searchdown2 "[!-(I_、-K]+", regular, inselect;
while( result ){
  $str = gettext( foundtopx, foundtopy, foundendx, foundendy, 1 );
  #num = #num + strlen( $str );
  moveto foundendx, foundendy;
  finddown2;
}

setreplace $r;
setsearch $h, #h;
hilightfound #f;
setsearch $s, #s;
escapeinselect;
enabledraw;
moveto #x, #y;
message str( ( #num + #num % 2 ) / 2 ) + "文字です";

[ ]
RE:22844 全角での文字数をカウントしたいNo.22851
Buckeye さん 07/04/07 06:40
 
彗星さん、

記事の執筆は、桁数×行数が指定される場合と文字数カウントということがあり
ますね。私は翻訳が本業なので、普段はファイル単位で自作のexeアプリ
(SimplyTerms)を使ってカウントしてするのですが、記事を書くときなどは、
途中で分量を見ながら調整するため、秀丸上でカウントしたほうが便利です。ま
た、同じファイルにいろいろとメモしていたり、段落単位で入れたり出したりし
ながら調整するときなど、範囲選択してカウントしたいときもあります。

そういうときに使っているマクロが添付のものです。もう10年以上も前に作った
マクロですし、総計だけでなく、タブの数とかもチェックしようとしているもの
なので、いろいろとアレですが、ご要望には添えるはずです。

・範囲指定してあればその範囲、なければ全体。
・カウント対象はテキストすべて(スペースは半角/全角でカウント、タブは半
  角としてカウント)
・半角は2文字で全角1文字、半端な半角が出たら切り上げ。
・最終結果はタイトル行(上の青い部分)に表示&選択範囲/ファイル末尾に挿
  入

    一文字ずつみている部分では改行もカウントしていますが、最終結果には入
    れてありません。

Best regards,
Buckeye

--------ここから
#FEP=imestate;
if (#FEP==1) imeswitch;  //漢字ONなら、いったん解除

main:
 disabledraw;    //描画禁止
 
// 変数初期設定
 ##f_error = 0;
 ##return  = 0x0D;
 ##tab     = 0x09;
 ##space_1 = ascii(" ");
 ##space_2 = ascii(" ");

 ##cnt_1   = 0;
 ##cnt_2   = 0;
 ##cnt_ret = 0;
 ##cnt_tab = 0;
 ##cnt_sp_1= 0;
 ##cnt_sp_2= 0;

// カウント範囲のセット
 if (selecting){
  call set_area;
 } else {
  gofiletop;
  #beginx = x;
  #beginy = y;
  gofileend;
  #endx   = x;
  #endy   = y;
 }

// 全角、半角文字のカウント
 title "文字数をカウント中です";
 moveto #endx, #endy;
 while ((x != #beginx) || (y != #beginy)){
  ##prev_x = column;
  left;
  if (code == ##return) {
   ##cnt_ret = ##cnt_ret + 1;   //リターン
  } else if (code == ##tab) {
   ##cnt_tab = ##cnt_tab + 1;   //タブ
  } else if (code == ##space_1) {
   ##cnt_sp_1 = ##cnt_sp_1 + 1;  //半角スペース
  } else if (code == ##space_2) {
   ##cnt_sp_2 = ##cnt_sp_2 + 1;  //全角スペース
  } else {
   if (column == ##prev_x - 1) {
    ##cnt_1 = ##cnt_1 + 1;   //半角文字
   } else if (column == ##prev_x - 2) {
    ##cnt_2 = ##cnt_2 + 1;   //全角文字
   } else {
    ##f_error = 1;     //上記からはじかれるもの
   }
  }
 }

// ##page1 は半角も1文字。##page2 は半角2文字で1文字。400字1ページ
 ##chr1  = ##cnt_2 + ##cnt_1 + ##cnt_tab + ##cnt_sp_1 + ##cnt_sp_2;
 ##page1 = ##chr1 / 4;
 $$page_1 = leftstr(str(##page1), strlen(str(##page1))-2)+"."+
 rightstr(str(##page1),2);

 ##chr2  = ##cnt_2 + ##cnt_sp_2 + (##cnt_1 + ##cnt_tab + ##cnt_sp_1 +
 1)/2;
 ##page2 = ##chr2 / 4;
 $$page_2 = leftstr(str(##page2), strlen(str(##page2))-2)+"."+
 rightstr(str(##page2),2);

// 結果表示−−タイトル行に表示する。
 title "(全角 " + str(##chr2) + "文字分、" + $$page_2 + "ページ)";
 question "末尾に文字数、ページ数を挿入しますか?";
 if (result == yes){
  moveto #endx, #endy;
  right;
  insert "(" + str(##chr1) + "文字、" + $$page_1 + "ページ)" + "
  \x0D\x0A";
  insert "(全角 " + str(##chr2) + "文字分、" + $$page_2 + "ペー
  ジ)"+ "\x0D\x0A";
 }

// 終了処理
 title 0;     //タイトル行をもとに戻す。
 enabledraw;     //描画再開
 if (#FEP==1) imeswitch;  //漢字に戻す
 endmacro;

//
// 選択範囲の上位側を#beginx, #beginy、下位側を#endx, #endyにセットする
// サブルーチン
//
set_area:
 #beginx = seltopx; #beginy = seltopy;
 #endx   = selendx; #endy   = selendy;
 escape;
 if ((#beginy > #endy) || ((#beginy == #endy) && (#beginx > #endx))){
  ##tempx = #beginx; ##tempy = #beginy;
  #beginx = #endx;   #beginy = #endy;
  #endx   = ##tempx; #endy   = ##tempy;
 }
 return;

--------ここまで

[ ]
RE:22851 全角での文字数をカウントしたいNo.22852
Buckeye さん 07/04/07 06:47
 
Iranoanさんが書かれている約物の取り扱いも書いておくべきでしたね。約物も
含めると、マクロのカウントに関する仕様は以下のようになります。

・範囲指定してあればその範囲、なければ全体。
・カウント対象はテキストすべて
    ・スペースは半角/全角を区別してカウント
    ・タブは半  角としてカウント
    ・約物は半角/全角を区別してカウント
・半角は2文字で全角1文字、半端な半角が出たら切り上げ。
・最終結果はタイトル行(上の青い部分)に表示&選択範囲/ファイル末尾に挿
  入

Best regards,
Buckeye

[ ]
RE:22848 全角での文字数をカウントしたいNo.22870
彗星 さん 07/04/11 12:47
 
秀丸担当さま、レスをありがとうございました。
お礼が遅くなり、失礼しました。

細かい条件を設定するのなら、自分で作るのが一番ですね。
マクロをアップしてくださった方のものをもとに、研究してみようかと思います。

V6.00以降の仕様についても、ご紹介をありがとうございました。
こちらも試してみます。

[ ]
RE:22850 全角での文字数をカウントしたいNo.22884
彗星 さん 07/04/16 14:05
 
Iranoanさん、彗星です。
詳しいマクロをアップしてくださって、ありがとうございました。
会議室の使い方になれていなくて、お礼が遅くなってしまってすみません。

> あるかどうかは解りませんが、作ることは可能でしょう。ただ細かい仕様
>(希望動作) は、使う人でないと解りませんからね〜。ここでの仕様とは、
>・半角の 2 文字で全角 1 文字は、
>  o 連続しているときだけ
>  o 全体か
>  のどちらなのか?
>・句読点、括弧などはどの様に扱うのか?
>等です。

マクロを作るときは、かなり細かいところまで考えないといけないのですね。
これを機会に、アップしてくださったサンプルを見ながら、少しいじってみます。

本当にありがとうございました!

[ ]
RE:22851 全角での文字数をカウントしたいNo.22885
彗星 さん 07/04/16 14:08
 
Buckeyeさん、彗星です。
マクロをアップしてくださって、ありがとうございました。
お礼が遅くなってしまってすみません。

アップしてくださったマクロ使ってみました。
文字数、ばっちり分かって助かりました。ありがとうございます。

>記事の執筆は、桁数×行数が指定される場合と文字数カウントということがありま
>すね。

1行何文字で何行、というオーダーとか、全体で何文字、というオーダーが多いのと、
部分的にここは何文字で、というところもあるので、範囲指定でカウントできると本
当に便利です。

自分でも少し、マクロが分かるように勉強してみようかと思います。
今回はありがとうございました!!

[ ]
RE:22885 全角での文字数をカウントしたいNo.22887
Buckeye さん 07/04/17 10:08
 
彗星さん、

お役にたてたようでなによりです。

>1行何文字で何行、というオーダーとか、全体で何文字、というオーダーが多いのと、
>部分的にここは何文字で、というところもあるので、範囲指定でカウントできると本
>当に便利です。

囲みとかキャプションとかはそんな感じになりそうですね。

>自分でも少し、マクロが分かるように勉強してみようかと思います。

汎用性があるものなら上手にマクロを作る方々がライブラリにいろいろとアップ
ロードしてくださってますが、やはり、自分のニーズにぴったりとなると、自分
で作らざるを得ないケースが出てきます。できるようになると便利ですよ。

Best regards,
Buckeye

[ ]