WindowsのシフトJISの文字リストを作るシェルスクリプト

文字、を作る数字を作るシェルスクリプト


画像みたいなテキストファイル、を作る数字の羅列を作る、シェルスクリプトです。
作るのはテキストファイルそのものでなくて、ただの数字。平たく言うと、ただの連番製造機
この数字の書かれたテキストファイルを、xxdコマンドなどでバイナリファイルに変換すると、いわゆるWindowsシフトJISのテキストファイルが作成されます。メモ帳なんかで読めます。

武蔵システムのTTEditに「文字一覧テキストファイルを作成」という機能があるんですが、これと同じ文字列、ってか、同じデータになります。

個人的に文字リストが必要になったんですが、ネットに沢山あるだろ、と思ったら、これが意外と見つかんない。表は見つかっても文字列がない。


意外とめんどくさかった

文字の羅列くらい、文字を並べればいいかと思ってたんだけど、忘れてました。

文字コードの後半部分を見ると、同じ文字がダーッとあります。これは、同じ文字でも中身のデータが違うわけです。だから、ブログにコピペ、しても意味がない。重複文字の半分のデータが消えちゃいます。
また、TTEditの出力ファイルをそのままネットに上げるってのは、フォント制作ソフトの通常の使用目的を超えるようで、ちょっとどうかなと。
そんなわけで、最近シェルスクリプトの勉強はじめたんで、勉強かねて作りました。初心者スクリプトなんで信頼性とか責任持てませんが、そのあたりは使う人がなんとかしてください。
初心者スクリプトのバグをチェックするくらいなら、データだけパクってスクリプト本体は一から書き直したほうが楽だと思うけど。


↓いろいろ書いてますが、基本よくわかってません。調べものには使えませんので、ご注意。
cp932、というより、TTEdit(の古いバージョンのデフォルト)に合わせてます。

1バイト文字作成用 cp932CharMaker3.sh

#!/bin/sh
#set -x
: << '#--------------------------------------------------------------comment'

■指定された範囲で、cp932の1バイト文字に相当する文字列を作成する

作成されたテキストファイルからバイナリを作成すると、cp932テキストファイルができる。


▼文字指定の規格
例)
20 7e
a1 df

開始バイト 終了バイト


#--------------------------------------------------------------comment

cp932CharMaker3(){

fileTime=`date +"%Y-%m-%d_%H-%M-%S"`

while read byteLineStartHex byteLineEndHex ;do
byteLineStartDec=`echo "${byteLineStartHex}" | tr a-z A-Z | xargs -I @@ echo 'obase=10;ibase=16;@@' | bc `
byteLineEndDec=`echo "${byteLineEndHex}" | tr a-z A-Z | xargs -I @@ echo 'obase=10;ibase=16;@@' | bc `

for n in `seq ${byteLineStartDec} ${byteLineEndDec}` ;do
echo "obase=16;ibase=10;${n}" | bc | sed "s/.*/0&/" | rev | cut -b 1-2 | rev ; 
done
done | fmt --width=80 --goal=80  #| tee "cp932${fileName}${fileTime}".txt
}
#: << '#--------------------------------------------------------------input_hex'
# cp932 半角英数字、半角カタカナ 158文字
fileName="_1byte_"
echo '20 7e
a1 df' | cp932CharMaker3
#--------------------------------------------------------------input_hex

: << '#--------------------------------------------------------------input_hex'
# 00〜ff を作成
fileName="_1byte_"
echo '00 ff' | cp932CharMaker3
#--------------------------------------------------------------input_hex

exit 0

2バイト文字作成用 cp932CharMaker4.sh

#!/bin/dash
#set -x
: << '#--------------------------------------------------------------comment'

■指定された範囲で、cp932の2バイト文字に相当する文字列を作成する r3

作成されたテキストファイルからバイナリを作成すると、cp932テキストファイルができる。

例)
cat cp932_hiragana_xxxx.txt | xxd -r -p > cp932txtFile.txt

▼文字指定の規格
例)
8940 89fc,| 7f | 7e

開始バイト(4桁) 終了バイト(4桁),「| 除外下位バイト」「| 除外下位バイト(2桁)」
・開始バイト、終了バイトは、4桁0埋めされなければならない。
・除外バイトは、2桁ゼロパディングでなければならない。
・英字は大文字でも小文字でも構わない。
NG:「a」,「| A」
OK:「000a」,「| 0A」
#--------------------------------------------------------------comment


cp932CharMaker4(){

fileTime=`date +"%Y-%m-%d_%H-%M-%S"`

#「8940 89ff, | 7f | fd | fe | ff」→「8940 89FF, | ??7F | ??FD | ??FE | ??FF」
tr a-f A-F | tr -d " " | sed 's/|\(..\)/| ??\1 /g;s/\(....\),/ \1,/' |
while IFS=, read byteLine ngByteSeq04 ; do

set -- ${byteLine}
byteLineStartDec=`printf "%d\n" 0X${1}`
byteLineEndDec=`printf "%d\n" 0X${2}`

for n in `seq ${byteLineStartDec} ${byteLineEndDec}` ;do
hex04=`printf "%04X\n" ${n}`

eval 'case ${hex04} in \
( ??zz '${ngByteSeq04}' ) \
true \
;; \
( * ) \
printf "%04X " ${n}; \
;; \
esac'

done
done | fmt --width=80 --goal=80  #| tee "cp932${fileName}${fileTime}".txt

}

#: << '#--------------------------------------------------------------input_hex'
# cp932 ひらがな、カタカナ、全角数字など 607文字
fileName="_hiragana_"
echo '8140 81ac, | 7f | 10
81b8 81bf, | 00
81c8 81ce, | 00
81da 81df, | 00
81e0 81e8, | 00
81f0 81f7, | 00
81fc 81fd, | fd
824f 8258, | 00
8260 8279, | 00
8281 829a, | 00
829f 82f1, | 00
8340 8396, | 7f
839f 83b6, | 00
83bf 83d6, | 00
8440 8460, | 00
8470 8491, | 7f
849f 84be, | 00
8740 8775, | 5e
877e 879c, | 7f' | cp932CharMaker4
#--------------------------------------------------------------input_hex
#: << '#--------------------------------------------------------------input_hex'
# cp932 第一水準漢字 2965文字
fileName="_kanji1_"
echo '889f 88fc, | 7f | fd | fe | ff
8940 89ff, | 7f | fd | fe | ff
8a40 8aff, | 7f | fd | fe | ff
8b40 8bff, | 7f | fd | fe | ff
8c40 8cff, | 7f | fd | fe | ff
8d40 8dff, | 7f | fd | fe | ff
8e40 8eff, | 7f | fd | fe | ff
8f40 8fff, | 7f | fd | fe | ff
9040 90ff, | 7f | fd | fe | ff
9140 91ff, | 7f | fd | fe | ff
9240 92ff, | 7f | fd | fe | ff
9340 93ff, | 7f | fd | fe | ff
9440 94ff, | 7f | fd | fe | ff
9540 95ff, | 7f | fd | fe | ff
9640 96ff, | 7f | fd | fe | ff
9740 97ff, | 7f | fd | fe | ff
9840 9872, | 00 ' | cp932CharMaker4
#--------------------------------------------------------------input_hex
#: << '#--------------------------------------------------------------input_hex'
# cp932 第二水準漢字 3390文字
fileName="_kanji2_"
echo '989f 98ff, | 7f | fd | fe | ff
9940 99ff, | 7f | fd | fe | ff
9a40 9aff, | 7f | fd | fe | ff
9b40 9bff, | 7f | fd | fe | ff
9c40 9cff, | 7f | fd | fe | ff
9d40 9dff, | 7f | fd | fe | ff
9e40 9eff, | 7f | fd | fe | ff
9f40 9fff, | 7f | fd | fe | ff
e040 e0ff, | 7f | fd | fe | ff
e140 e1ff, | 7f | fd | fe | ff
e240 e2ff, | 7f | fd | fe | ff
e340 e3ff, | 7f | fd | fe | ff
e440 e4ff, | 7f | fd | fe | ff
e540 e5ff, | 7f | fd | fe | ff
e640 e6ff, | 7f | fd | fe | ff
e740 e7ff, | 7f | fd | fe | ff
e840 e8ff, | 7f | fd | fe | ff
e940 e9ff, | 7f | fd | fe | ff
ea40 eaa4, | 7f | fd | fe | ff ' | cp932CharMaker4
#--------------------------------------------------------------input_hex
#: << '#--------------------------------------------------------------input_hex'
# cp932 IBM,NEC漢字 762文字 <<同一文字の異なるバイト列を含む>>
fileName="_kanjiEX_"
echo 'ed40 edff, | 7f | fd | fe | ff
ee40 eeec, | 7f | fd | fe | ff
eeef eefc, | 00
fa40 faff, | 7f | fd | fe | ff
fb40 fbff, | 7f | fd | fe | ff
fc40 fc4b, | 00 ' | cp932CharMaker4
#--------------------------------------------------------------input_hex
: << '#--------------------------------------------------------------input_hex'
# 0000〜ffff
fileName="_allHex_"
echo '0000 ffff, ' | cp932CharMaker4
#--------------------------------------------------------------input_hex


: << '#--------------------------------------------------------------comment'
# 端末からテキストを流し込む場合は、このコメントをコメントアウトして、端末から実行する。
# スクリプトファイル内のデータを使う場合は、それぞれをコメントアウトして、スクリプトファイルを実行する。


cp932CharMaker4
#--------------------------------------------------------------comment


exit 0

Ubuntu18.04、dash,bashで作ってます。他の環境は知りません。
スクリプト内のコメントにあるように、作成ファイルを「xxd -r -p」に流し込むと、テキストファイルになります。合計文字数で7882文字になるはず。