文字カウント
ナビゲーションに移動
検索に移動
選択範囲 or 文書全体の字数を算出するマクロです。
注意点
- 範囲選択時は選択範囲の字数を、非選択時は文書全体の字数をカウントします。
- 改行・半角文字・全角文字、すべて1文字とカウントします。
- 文字の分類は Shift_JIS (CP932) を基準にしています。
- Unicode 対応は一部に留まります。
- サロゲートペアは、Mery では仕様上2文字とカウントされますが、このマクロでは1文字とカウントします。
- 結合文字列や異体字セレクタなどには対応していません。他の文字と同じようにカウントされます。
- 文字数や文字種が増えるほど処理に時間がかかります(作者の環境では100万字の処理に約1.5秒かかりました)。
マクロ実行後、ステータスバーに処理に要した時間が表示されるので参考にしてください。
ソースコード
ダウンロード→ 文字カウント.zip
- 拙作ですがアイコンファイル (文字カウント.ico) を同梱してあります。
Mery 2.4.7 以降の場合、マクロ (文字カウント.js) と同じフォルダに、
Mery 2.4.6 以前の場合、Mery.exe と同じフォルダに、
アイコンファイルを配置しておくとツールバーにアイコンが読み込まれます。
更新履歴
- 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 の文字カウント仕様(段落数、半角英数の単語数)に近づけた。
※仕様が不明なため、完全再現は目指していません。
- 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"))+" バイト"
教育漢字を数える
応用例として、小学校で学年別に習う漢字のカウントを追加する方法を紹介します。
- 参考文献
- 文部科学省 - 小学校学習指導要領(平成29年告示) (PDF 5.8MB) pp.42–45 学年別漢字配当表
- Wikipedia - 学年別漢字配当表
文字分類への追加
- 2017(平成29)年改定版
{type:"総数,全角,罫線" /* 中略 */ },
// ↓ここより下に追加してください
//★学年別漢字配当表 1026字 2017(平成29)年改定
{type:"総数,全角,漢字,第一,小学,小一", re:/[一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土二日入年白八百文木本名目立力林六]/g},
{type:"総数,全角,漢字,第一,小学,小二", re:/[引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話]/g},
{type:"総数,全角,漢字,第一,小学,小三", re:/[悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流旅両緑礼列練路和]/g},
{type:"総数,全角,漢字,第一,小学,小四", re:/[愛案以衣位茨印英栄媛塩岡億加果貨課芽賀改械害街各覚潟完官管関観願岐希季旗器機議求泣給挙漁共協鏡競極熊訓軍郡群径景芸欠結建健験固功好香候康佐差菜最埼材崎昨札刷察参産散残氏司試児治滋辞鹿失借種周祝順初松笑唱焼照城縄臣信井成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲沖兆低底的典伝徒努灯働特徳栃奈梨熱念敗梅博阪飯飛必票標不夫付府阜富副兵別辺変便包法望牧末満未民無約勇要養浴利陸良料量輪類令冷例連老労録]/g},
{type:"総数,全角,漢字,第一,小学,小五", re:/[圧囲移因永営衛易益液演応往桜可仮価河過快解格確額刊幹慣眼紀基寄規喜技義逆久旧救居許境均禁句型経潔件険検限現減故個護効厚耕航鉱構興講告混査再災妻採際在財罪殺雑酸賛士支史志枝師資飼示似識質舎謝授修述術準序招証象賞条状常情織職制性政勢精製税責績接設絶祖素総造像増則測属率損貸態団断築貯張停提程適統堂銅導得毒独任燃能破犯判版比肥非費備評貧布婦武復複仏粉編弁保墓報豊防貿暴脈務夢迷綿輸余容略留領歴]/g},
{type:"総数,全角,漢字,第一,小学,小六", re:/[胃異遺域宇映延沿恩我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴券絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除承将傷障蒸針仁垂推寸盛聖誠舌宣専泉洗染銭善奏窓創装層操蔵臓存尊退宅担探誕段暖値宙忠著庁頂腸潮賃痛敵展討党糖届難乳認納脳派拝背肺俳班晩否批秘俵腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優預幼欲翌乱卵覧裏律臨朗論]/g},
// ↑ここより上に追加してください
{type:"総数,全角,漢字,第一" /* 中略 */ },
- 1989(平成元)年改定版
- ※小学1~3年は2017(平成29)年改定版と同一なので省略。
//★学年別漢字配当表 1006字 1989(平成元)年改定
{type:"総数,全角,漢字,第一,小学,小四", re:/[愛案以衣位囲胃印英栄塩億加果貨課芽改械害街各覚完官管関観願希季紀喜旗器機議求泣救給挙漁共協鏡競極訓軍郡径型景芸欠結建健験固功好候航康告差菜最材昨札刷殺察参産散残士氏史司試児治辞失借種周祝順初松笑唱焼象照賞臣信成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲貯兆腸低底停的典伝徒努灯堂働特得毒熱念敗梅博飯飛費必票標不夫付府副粉兵別辺変便包法望牧末満未脈民無約勇要養浴利陸良料量輪類令冷例歴連老労録]/g},
{type:"総数,全角,漢字,第一,小学,小五", re:/[圧移因永営衛易益液演応往桜恩可仮価河過賀快解格確額刊幹慣眼基寄規技義逆久旧居許境均禁句群経潔件券険検限現減故個護効厚耕鉱構興講混査再災妻採際在財罪雑酸賛支志枝師資飼示似識質舎謝授修述術準序招承証条状常情織職制性政勢精製税責績接設舌絶銭祖素総造像増則測属率損退貸態団断築張提程適敵統銅導徳独任燃能破犯判版比肥非備俵評貧布婦富武復複仏編弁保墓報豊防貿暴務夢迷綿輸余預容略留領]/g},
{type:"総数,全角,漢字,第一,小学,小六", re:/[異遺域宇映延沿我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除将傷障城蒸針仁垂推寸盛聖誠宣専泉洗染善奏窓創装層操蔵臓存尊宅担探誕段暖値宙忠著庁頂潮賃痛展討党糖届難乳認納脳派拝背肺俳班晩否批秘腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優幼欲翌乱卵覧裏律臨朗論]/g},
結果表示への追加例
," 漢字\t: "+(type["漢字"])+" ("+per(type["漢字"],type["字数"])+"/字数)"
// ↓ここより下に追加してください
," 小学\t: "+(type["小学"])+" ("+per(type["小学"],type["漢字"])+"/漢字)"
," 一 "+per(type["小一"],type["小学"])
+" 二 "+per(type["小二"],type["小学"])
+" 三 "+per(type["小三"],type["小学"])
," 四 "+per(type["小四"],type["小学"])
+" 五 "+per(type["小五"],type["小学"])
+" 六 "+per(type["小六"],type["小学"])
// ↑ここより上に追加してください
,"Unicode\t: "+(type["Uni"])+" (ペア "+(type["SP"])+")"
スポンサーリンク