emacsのSJIS自動変換の 不具合を多少改善する iconvを使った 一括文字コード変換

Pocket

emacsのSJIS自動変換の 不具合を多少改善する iconvを使った 一括文字コード変換
emacsのSJIS自動変換の不具合を多少改善するiconvを使った一括文字コード変換

序文

emacsのShift-JIS自動変換で、文字化け
emacsのShift-JIS自動変換で、文字化け

はい。

CygWinで、DOSのテキストファイルを閲覧刷する際に、emacsの文字コード自動変換に頼りまくっていたました。

しかし、emacsの自動変換モードはShift-JISだけが対象で、CP932(MS932。マイクロソフトがShift-JISを独自拡張した文字コード)あたりの臭い文字コードが出現すると、ひたすら文字化け(\xXXXXXXのUTF-8コード)が出まくっていました。

そこで、以下のように、Shift-JISのうち、CP932(MS932)にも対応したiconvを使って、少し見やすいテキストファイルにディレクトリごとコンバートするbashスクリプトを作りました。

今回のbashスクリプトにより、文字化けをソフトタッチに
今回のbashスクリプトにより、文字化けをソフトタッチに

主に、自己満足の世界ですが、昔のDOSのメモを見返すときもあり、重宝しています。

それではご紹介致します。

DOSファイル(CP932)からLinux用ファイル(UTF-8)へコンバート

これは、Linux World Scriptさんのコードを拝借して、少し改造したコードです。

iconvを使って、Shift-JIS(CP932)からUTF-8へ変換します。

なおiconvに「-c」オプションを付けて、変換できない文字コードがあった場合は、その文字の処理をスキップして処理を継続するようにしています。

出展:Linux World Script

コード:d2u.sh

#!/bin/bash

if [ -x "$1" ]
then
    chmod -x "$1"
fi

# 出力ファイル名のファイル名と拡張子の間に付けるマーク
outext="out"
if [ -n "$2" ]
then
    outext="$2"
fi

# ディレクトリ
dir=`dirname $1`
# 出力ディレクトリ
#if [ ! "$dir" = `pwd` ]
#then
#    outdir="${dir}.${outext}"
#    mkdir -p "${outdir}"
#else
#    outdir="${dir}"
#fi
# ファイル名(拡張子除く)
infname=`basename "$1"`
# 拡張子
ext="${infname##*.}"
# ファイル名
fname="${infname%.*}"
# 出力ファイル名
outfname="${fname}.${outext}.${ext}"

#cat "${infname}" | tr -d '/015' | iconv -f CP932 -t UTF-8 > "${outfname}"

#https://netmark.jp/2009/06/iconv.html
# -c : 変換できない文字を飛ばす。
#cat "${infname}" | tr -d '/015' | iconv -c -f CP932 -t UTF-8 > "${outdir}/${outfname}"
cat "$1" | tr -d '/015' | iconv -c -f CP932 -t UTF-8 > "${dir}/${outfname}"

ディレクトリツリー全ての1個1個のファイルにd2u.shの処理をかける

次に、d2u.shを1回1回実行するのは面倒ですので、findで一気に処理してしまうようにしました。

第1引数は、対象となるディレクトリです。

なお、d2u.shは、~/binにあるものと仮定しています。

コード:find_dosfile_to_unixfile.sh

#!/bin/bash

# 対象ディレクトリ
dir="$1"

# 出力拡張子
# ただし、元の拡張子は維持される
# ${filename}.${outext}".${ext}"
# となる。
outext="$2"

# ターゲットディレクトリ
if [ -n "${dir}" ]
then
    target=$(cd $(dirname "${dir}") && pwd)/$(basename "${dir}")
else
    target="."
fi

# DOSディレクトリのパーミッションが書き込み不可になっている場合、
# 以下を有効化してください。
find "${target}" -type d -exec chmod 755 {} \;

# d2u.sh を使って、SJISをUTF-8に変換しているところ
for fname in $(find "${target}" -name '*' -type f -print)
do
    echo "${fname}"
    ~/bin/d2u.sh "${fname}" "${outext}"
done

以下のようにして実行します。

find_dosfile_to_unixfile.shの実行
find_dosfile_to_unixfile.shの実行

今回は、私の以下の環境(ディレクトリツリー)にて実行しました。

KaBAのテスト環境(ディレクトリツリー)
KaBAのテスト環境(ディレクトリツリー)

実行中は、以下のように、処理したファイルが表示されます。

(必要無い方は、find_dosfile_to_unixfile.sh のechoを#でオフにしてください。

find_dosfile_to_unixfile.sh実行中の画面
find_dosfile_to_unixfile.sh実行中の画面

実行結果として、「XXX.<ext>」というファイルに対して「XXX.out.<ext>」というファイルができます。

「XXX.out.<ext>」というファイルがUTF-8にコンバートされたファイルです。

以下のようになります。

実行結果
実行結果

ご紹介は以上です。

ぜひ、スクリプトを皆さんの手になじむようにカスタマイズされてください。

変換不能文字は以前としてあります。
変換不能文字は以前としてあります。

ただし、変換不能文字は以前としてあります。

外字でしょうか?iconvがお手上げの場合は、d2u.shもお手上げです。(ノД`)

少し後味が悪いですが、それではー またー (^_^)/

=== 2018/09/11追記 ===

上図は、d2u.shでコンバートする前のファイルでした。d2u.shでコンバートすると大丈夫(ソフトタッチ)になります。

===================