ちょっと今、文字数のカウント方法について悩んでおりまして……。
ライティングした記事の文字数が知りたい
最近、某クライアントさんの案件で、報酬額の計算が1記事単位から文字数単位に変わりました。これにともなって文字数をカウントすることになったんですが、Wordだとちょっと難しい。
VBAでどうにかできないかとも思ったんですが、やったことがなくて、コードを見てもいまいち理解が足りないのと、理解が間違っていなければ、「見出し」と「本文」だけをターゲットにして空白・改行を入れずにカウントするのは難しいらしい。
Markdownならできそう?
自分で作るか迷っていたところに、QuiitaでMarkdownで作った文章をNode.jsを使って文字カウントする手段を提供してくれてる方がいました。でも、これ、見出しの文字数が入らないのですよね。たぶん、JavaScriptで書いてあるから、コード読んで改良すればいいことではあるでしょうけれども……。(今日はちょっとおなかいっぱい。)
文章作成と文字数カウントをWebサイトでやるには?
先日はGoogleフォーム→Googleスプレッドシートでカウントするのが一番楽かな、とも思ったんですが、そこからWordファイルまで持って行くのが手間で。いや、頑張ればできるかもしれないけれども。現時点ではちょい余裕がないです。
むしろ、直近でやるなら、JavaScriptかPHPでカウントできるようにサイトを作ってみるほうがまだ実現可能性がありそうです。だって、Word VBAの時と違って資料がいっぱいあるんですもの。
ってわけで、あとで読むために以下に気になるページを貼り付けておきます。頑張れよ、自分。
文字数カウントのためのPHPコーディングの資料
ざっくりと調べたところと、既存知識によると、日本語の文字カウントで問題になるのは、
- マルチバイトの文字をカウントする
- 改行をカウントしない
- 半角・全角の空白をカウントしない
の3つのポイント。私が欲しい文字カウントはこれらのすべての機能を実現してないといけません。
マルチバイトの文字のカウント
マルチバイト文字列をカウントするmb_strlenというのをシンプルに紹介。

mb_strlenで数えさえすればいいってわけじゃなくて、文字のエンコードも指定しないと、文字数がおかしくなっちゃう。なので、オプションの引数で文字エンコードを指定する。

上のページで話しているエンコードの件で、マルチバイト文字コードを一括設定する方法(?)を紹介。.htaccessで設定することもできるらしい。
改行の処理
WindowsはCR+LF、Linux(?)はLFで改行を記録している(改行コード)んだけど、これを考慮しておかないと、例えば改行~CT+LF=2文字とカウントされてしまう! これを防ぐ方法。(個別に改行をカウントして、最後に全体から引くのかな……?)

Web上のフォームに入力するときに、JavaScriptで文字数をカウントしつつ、PHPでもデータベースに入る文字数をカウント、でフツーにやると改行でつまづくらしい。ので、その対処。(mysql_real_escape_string というのと、入力フォームの改行位置にbrタグを入れてくれる関数nl2brというのがあるらしい。)

こちらもの方はCR+LFの改行を空白に置き換えてから文字数カウントにかけることにしてみたようだ。(で、ダメだったのかな? とすると、改行の処理の最初のリンク先みたいにするのが良さげ。)
半角・全角の空白
半角・全角の空白=スペースと、タブの正規表現での書き方。

文字列中の空白を除去するtrim関数、preg_replace関数などについて。これ、コード内に全角スペース置いてるんですかね、いいのかな?
PHPのエスケープシーケンス。バックスラッシュをつけて書く、特別な書き方。(余談ですが、改ページのコードがあるけど、これ入ってたらヤバそう。web上からの入力ならいいけど、Wordとかをアップロードして任意の形式で文字数カウントするようなサービスだったら確実に引っかかりそう。心に留めておこう……。あれ、Shift+Enterの改行って何になるんだ?)

mb_convert_kanaって関数で全角スペースを半角スペースに変換するというのを紹介。
うーん、どうだろう。上のほうのpreg_replace関数ならそれ一行だけで済むけど、mb_conver_kanaはさらにtrim関数使って空白除去で手間がかかりそうだ……。

文字列中の空白だけじゃなくて、ほかのも一緒に削除しちゃう。
要するに、文字列の前後から、空白文字や改行の他 通常は不要と思われる制御文字なんかもまとめて全部削除しちゃえ!という意味になります。
っておっしゃるとおり、私=初心者が見るとさっぱりな文字を拾うエスケープシーケンスが入ってます。使うならこれじゃない? 上のほうの疑問点がクリアされてるぞ!
余談:結局、Wordで書くべきか?
しかし、悩みますね。
WordVBAでは検索しまくっても今ひとつわからなかったけど、Markdownだと文字数カウントの手がかりとしてセクションがわかりやすいためか、けっこうヒットする。問題は空白・改行をカウントしているかどうかだけど、どうだろう。https://t.co/l9qMu56HYV
— 竹原万葉24daysHasPassed (@takeharakazuha) September 11, 2018
Twitterで書いた、Markdownでの文字カウントは悪くはなかったんだけど、ベストでもなくて。Markdownに使う快適なテキストエディタ(Windows10で問題なく使えるもの)も今ひとつ見つからないし……。
ひとまず今月はWordで書いて、選択部分の文字カウントさせて、最後に手計算かなぁ。
しかし、こうした作業がアナログすぎてぞわぞわする程度にはプログラマー的省エネ思考になってきたの、すごいぞ!
コメント