「文字カウント」の版間の差分

提供:MeryWiki
ナビゲーションに移動 検索に移動
(マクロ更新。「文字種一覧」を「文字分類」に改称。)
(「結果表示」を拡充。(差分表示の見栄えのため分割編集))
197行目: 197行目:
「文字カウント」マクロは、この定義を上から順に見て、該当する箇所を数えます。
「文字カウント」マクロは、この定義を上から順に見て、該当する箇所を数えます。


==結果表示について==
==結果表示==
表示される結果は、ソースコードの最後のほうにある「ここから~ここまで結果表示の定義」の部分で定義されています。<br>
現在の定義は下表のとおりです。
ソースコードを単純化すると、以下のような処理になっています。
* <b style="background:#fcc;">赤地</b> の項目は、初期状態で表示される項目です。
{|class="wikitable"
! 項目名 !! 表示例 !! 関係する分類 !! 説明
|-
!style="background:#fcc;"| 総字数
| 12345 (文書全体)<br>12345 (選択範囲)
| 総数 || スペースを含む文字数と、計測範囲
|-
!style="background:#fcc;"| 字数
| 12345 (改行・空白抜き)
| 総数−空白 || スペースを含まない文字数
|-
! 原稿
| 12~16枚 (12分)<br>123~164枚 (1.2時間)
| 総数、字数 || 原稿用紙枚数(400~300字/枚)と、読了時間(400字/分)
|-
!style="background:#fcc;"| 改行
| 12345 (CR+LF)
| 改行 || 改行の数と、改行コード
|-
!style="background:#fcc;"| 段落
| 12345
| 段落 || 空白行でない論理行数
|-
! 半英単
| 12345
| 半英単 || ASCII文字(半角英数)の単語数
|-
!style="background:#fcc;"| 半角
| 12345 (半カナ 12345)
| 半角、半カナ || 半角文字の数と、半角カナの数
|-
!style="background:#fcc;"| 全角
| 12345 (依存 12345)
| 全角、MS依存 || 全角文字の数と、Shift_JIS での環境依存文字の数
|-
!style="background:#fcc;"| 仮名
| 12345 (12.3%/字数)
| 仮名 || 仮名文字の数と、「字数」に占める割合
|-
! 漢字
| 12345 (12.3%/字数)
| 漢字 || 漢字の数と、「字数」に占める割合
|-
!style="background:#fcc;"| Unicode
| 12345 (ペア 12345)
| Uni、SP || Shift_JIS では保存できない文字の数と、サロゲートペアの数
|-
!style="background:#fcc;"| サイズ
| 12,345 バイト
| || 現在のエンコードでの容量
|-
! UTF-16
| 12,345+2(BOM) バイト
| || UTF-16 での容量
|-
! UTF-8
| 12,345+3(BOM) バイト
| || UTF-8 での容量
|-
! UTF-7
| 12,345 バイト
| || UTF-7 での容量
|-
! EUC
| 12,345 バイト
| || 日本語 (EUC) / EUC-JP (CP51932) での容量
|-
! JIS
| 12,345 バイト
| || 日本語 (JIS) / ISO-2022-JP (CP50222) での容量
|-
! SJIS
| 12,345 バイト
| || 日本語 (シフトJIS) / Shift_JIS (CP932) での容量
|}
 
===結果表示の仕様===
結果表示は、ソースコードの最後あたりにある「▼結果表示」以下で定義されています。
<source lang="javascript">
<source lang="javascript">
var result = (※出力用のテキストを生成);
//▼結果表示
Alert(result);
/* 中略 */
Alert( [""
// ----------------- ↓ここから表示
,"総字数\t: "+(type["総数"])+" ("+ RANGE +")"
," 字数\t: "+(type["字数"])+" (改行・空白抜き)"
//," 原稿\t: "+paper(type["総数"])+" ("+time(type["字数"])+")"
," 改行\t: "+(type["改行"])+" ("+ BREAK +")"
," 段落\t: "+(type["段落"])
//,"半英単\t: "+(type["半英単"])
," 半角\t: "+(type["半角"])+" (半カナ "+(type["半カナ"])+")"
," 全角\t: "+(type["全角"])+" (依存 "+(type["MS依存"])+")"
," 仮名\t: "+(type["仮名"])+" ("+per(type["仮名"],type["字数"])+"/字数)"
//," 漢字\t: "+(type["漢字"])+" ("+per(type["漢字"],type["字数"])+"/字数)"
,"Unicode\t: "+(type["Uni"])+" (ペア "+(type["SP"])+")"
,""
,"サイズ\t: "+(bytes())+" バイト"
//,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
//,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC  \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS  \t: "+(bytes("iso-2022-jp"))+" バイト"
//,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
// ----------------- ↑ここまで表示
].join("\n").replace(/^\n+|\n+$/g,"") );
</source>
{|class="wikitable"
! type[分類名]
| カウント結果。たとえば「総数」に該当した数は type["総数"] で得られます。
|-
! paper(n)
| 原稿用紙枚数を求める関数(1枚400~300字で概算)。<br>単純に n÷400 と n÷300(切り上げ)で算出します。
|-
! time(n)
| 読了時間を求める関数(1分400字で概算)。<br>60分未満は「分」表示(切り上げ)、60分以上は「時間」表示(小数第1位まで四捨五入)です。
|-
! per(n,m)
| m に占める n の割合(百分率)を求める関数。<br>10%未満は小数第2位まで切り捨て、100%未満は第1位まで切り捨て、100%以上は切り上げです。
|-
! bytes(enc)
| 容量(バイト数)を求める関数。<br>enc には[[マクロリファレンス:エンコード定数|エンコード定数]] または ADODB.Stream の Charset プロパティに渡す文字列を指定します。<br>指定しない場合、現在のエンコードになります。
|}
 
===表示項目を増やす===
初期状態で表示されない項目を表示するには、ソースコードの行頭の <code>//</code> を削除してください。
<source lang="javascript">
,"サイズ\t: "+(bytes())+" バイト"
//,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
//,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC  \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS  \t: "+(bytes("iso-2022-jp"))+" バイト"
//,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
</source>
:↓「サイズ」を非表示、「UTF-16」「UTF-8」「SJIS」を表示する場合
<source lang="javascript">
//,"サイズ\t: "+(bytes())+" バイト"
,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC  \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS  \t: "+(bytes("iso-2022-jp"))+" バイト"
,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
</source>
</source>

2019年6月16日 (日) 16:51時点における版

選択範囲or文書全体の字数を算出するマクロです。

CharacterCounter.png

注意点

  • 改行・半角文字・全角文字、すべて1文字とカウントします。
  • 文字の分類は Shift_JIS (CP932) を基準にしています。
  • Unicode 対応は一部に留まります。
    • サロゲートペアは、Mery では仕様上2文字とカウントされますが、このマクロでは1文字とカウントします。
    • 結合文字列や異体字セレクタなどには対応していません。他の文字と同じようにカウントされます。
  • 文字数や文字種が増えるほど処理に時間がかかります(作者の環境では100万字の処理に約1.5秒かかりました)。
    マクロ実行後、ステータスバーに処理に要した時間が表示されるので参考にしてください。

ソースコード

ダウンロード→ 文字カウント.zip

  • 拙作ですがアイコンファイル (文字カウント.ico) を同梱してあります。
    Mery 2.4.7 以降の場合、マクロ (文字カウント.js) と同じフォルダに、
    Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、
    アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。

更新履歴

ファイル:文字カウント.zip

  • 2019/06/16
    • 容量は ADODB.Stream を利用して算出するようにした(マクロ「バイト数」の ks 氏版を参考)。
    • 文字分類を改訂。
      • 容量の定義を撤廃し、統合できる項目を統合。
      • 分類「階層」を削除。
      • 分類「空白」に「改行」を含めるようにした。
      • 分類「半カナ」を「半カナ」に改称。
      • 分類「MS依存」を追加。
      • CP932 未定義文字の分類を "総数,MS外字" → "総数,MS依存" に変更。
    • 結果表示を改訂。
      • 「段落」を復活。
      • 「仮名」を追加(仮名文字の数と、「字数」に占める割合を表示)。
      • 「サイズ」を追加(現在のエンコードでの容量を表示)。
      • 「UTF-16」「UTF-8」「SJIS」は非表示に変更。
      • 「原稿」「漢字」「UTF-7」「EUC」「JIS」を追加(非表示)。
    • アイコンのカラーパレットを調整。48x48の画像を一部変更(1と3)。
  • 2018/08/04
    • Document.LineEnding が使える場合は使うようにした(Mery 2.6.10 以降)。
      改行コードの判別にクリップボードを使わずに済むため、難点が解消されます。
  • 2017/06/25
    • アイコンファイルに24x24・32x32・48x48の画像を追加。
  • 2015/12/26
    • アイコンの指定先を "My Macros\文字カウント.ico" → "文字カウント.ico" に変更。
  • 2015/09/30
    • 改行コードを判別し、容量に反映するようにした。ただし、判別にクリップボードを使うため、難点があります。
      • 計測範囲に改行が存在しない場合は判別できない。
      • クリップボード履歴が重複してしまう。
    • 結果表示を改訂。
      • 「段落」は非表示に変更(後述の定義変更による)。
      • 「拡張」を「依存」に改称し、MS拡張 → MS拡張+MS外字 の数に変更。
      • 「サロゲート」を「ペア」に改称。
      • 「SJIS」の内容を「数値 bytes」→「数値 バイト」に変更。
      • 「UTF-16」の内容を「数値 bytes (BOM無)」→「数値+2(BOM) バイト」に変更。
      • 「UTF-8」の内容を「数値 bytes (BOM無)」→「数値+3(BOM) バイト」に変更。
    • 文字分類を改訂。
      • 分類「段落」の定義を変更。 /^(?= [^ \s])/gm → /^(?![  \t]*$)/gm
      • 分類「英単」を「半英単」に改称し、定義を変更。 /\b(?=\w)/g → /(?=[!-~](?![!-~]))/g
        Microsoft Word の文字カウント仕様(段落数、半角英数の単語数)に近づけた。
        ※仕様が不明なため、完全再現は目指していません。
      • 分類「会話」を削除。
      • ユーザー定義外字の分類を "総数,MS外字" → "総数,MS外字,全角" に変更。
      • 文字 U+0080 の分類を "総数,Uni" → "総数,MS外字" に変更。
      • Shift_JIS で保存すると似た字に化ける文字群を追加。
  • 2014/02/17
    • アウトラインやアウトプットにフォーカスがある場合、カウントできないのを修正。
      文書の取得を Document → Editor.ActiveDocument に変更。
    • 分類「段落」の正規表現を短縮。 /^(?= [^ \s]+)/gm → /^(?= [^ \s])/gm
    • 分類「会話」の定義を変更。 /^(?=「.+」$)/gm → /^(?=「.*」$)/gm
  • 2014/02/01
    • 初版公開。

文字分類

現在の定義は下表のとおりです。分類は Shift_JIS (CP932) を基準にしています。

  • 赤地 の項目は、初期状態で結果表示される項目です。
  • 「字数」は 総数空白 で算出されます。
分類 (type) 正規表現 (re) 備考
半英単 /(?=[!-~](?![!-~]))/g ASCII文字の単語(半角英数の単語)
段落 /^(?![  \t]*$)/gm 空白行でない論理行
総数
制御 空白 改行 /\n/g ASCII制御文字(改行)
タブ /\t/g ASCII制御文字(水平タブ)
/[\u0000-\u001F\u007F]/g 上記以外のASCII制御文字
半角 空白 半空 / /g ASCII文字(半角空白)
数字 半数 /[0-9]/g ASCII文字(半角数字)
英字 半英 /[A-Za-z]/g ASCII文字(半角英字)
記号 /[\u0020-\u007E]/g 上記以外のASCII文字
半カナ /[。「」、・ー゙゚]/g
仮名 /[ヲ-ッア-ン]/g
全角 空白 全空 / /g
数字 全数 /[0-9]/g
英字 全英 /[A-Za-z]/g
仮名 かな /[ぁ-ん]/g ※SJISでは ゔ ゕ ゖ などは扱えない
カナ /[ァ-ヶ]/g ※長音符や踊り字は記号扱い
ギリシャ /[Α-ΡΣ-Ωα-ρσ-ω]/g ※SJISではシグマの語末形 ς は扱えない
キリル /[ЁА-Яа-яё]/g ※Unicodeでは Ё ё の配置がJISと異なる
記号 /[、。, (中略) ‡¶◯]/g 記号 (146字)
罫線 /[─│┌ (中略) ┥┸╂]/g 罫線素片 (32字)
漢字 第一 /[亜唖娃 (中略) 湾碗腕]/g JIS第一水準漢字 (2965字)
第二 /[弌丐丕 (中略) 瑤凜熙]/g JIS第二水準漢字 (3390字)
MS拡張 /[纊褜鍈 (中略) 鶴鸙黑]/g IBM拡張文字 (漢字360字)
MS依存
MS拡張 /[①-⑳ (中略) ¦'"]/g NEC特殊文字/IBM拡張文字 (記号等87字)
MS外字 /[\uE000-\uE757]/g Microsoft ユーザー定義外字 (1880字)
/[\u0080\uF8F0-\uF8F3]/g CP932 未定義文字 (5字)
Uni SP /[\uD800-\uDBFF][\uDC00-\uDFFF]/g サロゲートペア (U+10000~10FFFF)
/[\u0000-\uFFFF]/g 上記以外の全文字
  • Uni に分類される文字は、Shift_JIS では正常に保存できません。保存を強行した場合、似た文字や ? に化けます。
  • MS依存 に分類される文字は、Shift_JIS では「環境依存文字」に該当します。
  • 改行の定義が /\n/g なのは Mery の内部改行コードが [LF] で統一されているためです。

文字分類の仕様

文字分類は、ソースコードの最初あたりにある「■文字分類」以下で定義されています。

//■文字分類
{type:"総数,全角,カナ", re:/[ァ-ヶ]/g},  //一例
/* 以下略 */
re カウントする対象を正規表現で記述します。
たとえば全角カタカナなら、re:/[ァ-ヶ]/g という具合です。
利用できる正規表現は、実行環境 JScript (JavaScript) の仕様に依存します。
type 分類名です。複数設定する場合はコンマで区切ります。
たとえば、type:"総数,全角,カナ" という具合です。
この場合、type["総数"], type["全角"], type["カナ"] の各変数にカウントが加算されます。

「文字カウント」マクロは、この定義を上から順に見て、該当する箇所を数えます。

結果表示

現在の定義は下表のとおりです。

  • 赤地 の項目は、初期状態で表示される項目です。
項目名 表示例 関係する分類 説明
総字数 12345 (文書全体)
12345 (選択範囲)
総数 スペースを含む文字数と、計測範囲
字数 12345 (改行・空白抜き) 総数−空白 スペースを含まない文字数
原稿 12~16枚 (12分)
123~164枚 (1.2時間)
総数、字数 原稿用紙枚数(400~300字/枚)と、読了時間(400字/分)
改行 12345 (CR+LF) 改行 改行の数と、改行コード
段落 12345 段落 空白行でない論理行数
半英単 12345 半英単 ASCII文字(半角英数)の単語数
半角 12345 (半カナ 12345) 半角、半カナ 半角文字の数と、半角カナの数
全角 12345 (依存 12345) 全角、MS依存 全角文字の数と、Shift_JIS での環境依存文字の数
仮名 12345 (12.3%/字数) 仮名 仮名文字の数と、「字数」に占める割合
漢字 12345 (12.3%/字数) 漢字 漢字の数と、「字数」に占める割合
Unicode 12345 (ペア 12345) Uni、SP Shift_JIS では保存できない文字の数と、サロゲートペアの数
サイズ 12,345 バイト 現在のエンコードでの容量
UTF-16 12,345+2(BOM) バイト UTF-16 での容量
UTF-8 12,345+3(BOM) バイト UTF-8 での容量
UTF-7 12,345 バイト UTF-7 での容量
EUC 12,345 バイト 日本語 (EUC) / EUC-JP (CP51932) での容量
JIS 12,345 バイト 日本語 (JIS) / ISO-2022-JP (CP50222) での容量
SJIS 12,345 バイト 日本語 (シフトJIS) / Shift_JIS (CP932) での容量

結果表示の仕様

結果表示は、ソースコードの最後あたりにある「▼結果表示」以下で定義されています。

//▼結果表示
/* 中略 */
Alert( [""
// ----------------- ↓ここから表示
,"総字数\t: "+(type["総数"])+" ("+ RANGE +")"
," 字数\t: "+(type["字数"])+" (改行・空白抜き)"
//," 原稿\t: "+paper(type["総数"])+" ("+time(type["字数"])+")"
," 改行\t: "+(type["改行"])+" ("+ BREAK +")"
," 段落\t: "+(type["段落"])
//,"半英単\t: "+(type["半英単"])
," 半角\t: "+(type["半角"])+" (半カナ "+(type["半カナ"])+")"
," 全角\t: "+(type["全角"])+" (依存 "+(type["MS依存"])+")"
," 仮名\t: "+(type["仮名"])+" ("+per(type["仮名"],type["字数"])+"/字数)"
//," 漢字\t: "+(type["漢字"])+" ("+per(type["漢字"],type["字数"])+"/字数)"
,"Unicode\t: "+(type["Uni"])+" (ペア "+(type["SP"])+")"
,""
,"サイズ\t: "+(bytes())+" バイト"
//,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
//,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC   \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS   \t: "+(bytes("iso-2022-jp"))+" バイト"
//,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
// ----------------- ↑ここまで表示
].join("\n").replace(/^\n+|\n+$/g,"") );
type[分類名] カウント結果。たとえば「総数」に該当した数は type["総数"] で得られます。
paper(n) 原稿用紙枚数を求める関数(1枚400~300字で概算)。
単純に n÷400 と n÷300(切り上げ)で算出します。
time(n) 読了時間を求める関数(1分400字で概算)。
60分未満は「分」表示(切り上げ)、60分以上は「時間」表示(小数第1位まで四捨五入)です。
per(n,m) m に占める n の割合(百分率)を求める関数。
10%未満は小数第2位まで切り捨て、100%未満は第1位まで切り捨て、100%以上は切り上げです。
bytes(enc) 容量(バイト数)を求める関数。
enc にはエンコード定数 または ADODB.Stream の Charset プロパティに渡す文字列を指定します。
指定しない場合、現在のエンコードになります。

表示項目を増やす

初期状態で表示されない項目を表示するには、ソースコードの行頭の // を削除してください。

,"サイズ\t: "+(bytes())+" バイト"
//,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
//,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC   \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS   \t: "+(bytes("iso-2022-jp"))+" バイト"
//,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
↓「サイズ」を非表示、「UTF-16」「UTF-8」「SJIS」を表示する場合
//,"サイズ\t: "+(bytes())+" バイト"
,"UTF-16\t: "+(bytes("utf-16"))+"+2(BOM) バイト"
,"UTF-8 \t: "+(bytes("utf-8",-3))+"+3(BOM) バイト"
//,"UTF-7 \t: "+(bytes("utf-7"))+" バイト"
//,"EUC   \t: "+(bytes("euc-jp"))+" バイト"
//,"JIS   \t: "+(bytes("iso-2022-jp"))+" バイト"
,"SJIS  \t: "+(bytes("shift_jis"))+" バイト"
スポンサーリンク