awk 《第9回》split関数でつまづく

Shift-JIS」ではうまくいくものが「UTF-8」ではうまくいきません。いろいろ試していますが、原因が不明です。

Markdownでボールドにする印が「**~**」のようにアスタリスク2個で囲むことで、HTMLにしたときに<strong>~</strong>になる約束になっています。

親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。弱虫やーい。と囃したからである。小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。

WordPressはMarkdownに対応しているので、ちゃんとボールドになっています。

上記の例だと「**」は8か所に使われています。

split」の第一引数は対象の文字列で、第2引数は分割した文字列を収納する配列、第3引数は切り出す文字列になりますが、ここは文字列でも構わないし、正規表現でも構いません。

「*」アスタリスクは約束語なので「\」でエスケープしています。おそらく文字列として ”**” でも構わないと思いますが、約束語は厄介なことが起きる可能性があるので正規表現にしてエスケープしたほうが安心です。

このスクリプトを通すと、「UTF-8」のMarkdownファイルだと、

strong>親譲りの無鉄砲</storng>で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。**新築の二階<strong>から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。**弱虫やーい**。と囃したからである。小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、**この次は抜かさずに飛んで見せます**と答えた。</storng

このようになってしまいます。赤のアスタリスクはsplitできませんでした。

それでMarkdownファイルを「Shift-JIS」に変化して同じスクリプトを通すと、

strong親譲りの無鉄砲</storng>で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。<strong新築の二階</storng>から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。<strong弱虫やーい</storng>。と囃したからである。小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、<strongこの次は抜かさずに飛んで見せます</storng>と答えた。

のように一致している。

つまり、今使っているWindows版の GNU AWK 5.1.0 では、「UTF-8」を処理するときは、十分な注意が必要ということのようです。

ちなみに、「**」が厄介なことを起こしているのかもと思って、半角2文字を連続させてみたり、全角に置換してみたりしましたが、結果は同じでした。

nkfをインストールする

文字コードを変換するとなれば「nkf」です。

色々な人の記事がありますが、日付のない記事も少なくなくてグーグルの表示がどういう順番なのかが分からないのですが、比較的新しい記事が2021年にありましたので、それを参考にしました。

nkfwin]の中に[vc2005]があり[win32(98,Me,NT,2000,XP,Vista,7)Windows-31J]と言うフォルダの中にある[nkf32.exe]を使うのだそうです。

これを「nkf.exe」にリネームしてpathを通します。pathを通すのは、どこからでも使えるようにするためです。そうじゃないと、文字コード変換したいフォルダごとにnkfが必要になってしまいます。

「設定」をクリック

「システム」をクリック

「詳細情報」をクリック

そうすると、少し小さい設定画面が出てきます。

「環境変数」をクリックすると環境変数の設定画面になります。

ユーザー環境変数」と「システム環境変数」があります。ユーザー環境変数とは複数のユーザーでPCを使用する場合、ユーザーごとに設定を変えることができるためだそうです。

システム環境変数」は、共通して使える環境編巣になります。

「編集」ボタンをクリックします。

上記の場合は「C:\nkf」としてありますが、nkfをどこに置くかは自由に決めてください。

nkfを使う

「nkf」の使い方ですが、

UTF-8に書き換える場合
nkf -w –overwrite ターゲットファイル名

shift-JISに書き換える場合
nkf -s –overwrite ターゲットファイル名

overwrite」は上書きするパラメータです。

ターゲットファイルが複数ある場合は「*.html」のようにすることも可能です。

UTFには「BOMあり」と「なし」がありますが、「なし」のほうがweb環境では問題がないとのことです。Excelでは「あり」にしないと「UTF」が「8」なのか「16」なのか「32」なのかが分からない場合があると書かれていました。

余談ですが、今作っているawkの処理は WORD文書を「Markdown」にして、そのファイルをHTMLにダイレクトに加工してしまう処理です。

ターゲットはマニュアルなのですが、見出し2でファイルを分断しているのでShift-JISに変換してしまうとHTMLのヘッダで「utf-8」を定義してあるのでことごとくファイルを開けるときにはエディタにShit-JISであることを通知してやらなければなりません。

そこでnkfが必要になったというわけです。

つまり、utf-8で出力されたMarkdownファイルをnkfでShift-JISにしてawkで加工し、生成されたHTMLファイルをShift-JISからutf-8に戻してやるというわけです。

スポット使用ならPATHの設定などは不要で、使用するフォルダにnkf.exeを置くだけで目的は対処できます。