初歩のシェルスクリプトで遊ぶ[CP932テキストファイルを外部コマンドなしでUTF8へ変換する]

初歩のシェルスクリプトで遊ぶ[Unicodeコードポイントをutf8へ変換するシェル関数] - HatenaDiary id:Narr
CP932、いわゆるシフトJISのテキストファイルを、UTF8に変換します。iconvはもちろん、odコマンドも使いません。最後は先週のこれを使います。
いちばん無理矢理なのはodコマンドの代用です。さすがにこれは厳しくて、動かないシェルもあります。バイナリデータはシェルの領分じゃないってことっすね。スクリプトの中にodコマンドでの実装も入れてあります。
CP932とutf8の変換辞書はどうしても必要になりますが、これは単純に変数を大量に定義してます。連想配列的なものを、evalで。このファイルをsourceで読み込むときに外部コマンドを使ってるだけで、他では外部コマンドを使ってない、はず。コマンド置換など、遅くなる要因も、できるだけ減らしてます。
全体としては実用性はありません。しかし、最後の printf \UXXXX の代用関数と、進数変換のシェル関数なんかは、そこそこ便利です。
辞書ファイルの定義を簡単に変えられることが利点といえば利点、か。Unicodeのコードポイントの指定を複数文字にすることができます。たとえば「味噌」を「味噌󠄀」の異体字セレクタがついた状態に直接変換できる。

辞書ファイルは長くてブログに載せられませんでした。そのうちダウンロードのとこに置いておきます。
直接にダウンロードに置くか、chikuwaの中に一緒に置くか、忘れてるか、どれかということで。

#!/bin/sh
#!/usr/bin/busybox sh
#!/bin/bash
#!/usr/bin/zsh
#!/usr/bin/yash
#!/usr/bin/ksh

#PATH=''
# ======================================================================================
# ■ CP932 -> UTF8 iconv,od 無し
# 
# 辞書ファイルが必要
# ${1} 任意指定辞書ファイル
# ${0}/assets/dic_cp932toUtf32be.func
# 
# yash 実行不可 (odFake非対応 _odFakeなら実行可能)
# 
# ======================================================================================



if test -f "${1}" && . "${1}"
then true
elif . "$( dirname -- "`realpath "${0}"`" )"/assets/dic_cp932toUtf32be.func
then true
else
  echo "${0}:辞書ファイルが読み込めません" 1>&2
  exit 1
fi

set -u

if test -n "${cp932_20}"
then true
else
  echo "${0}:辞書ファイルに誤りがあります" 1>&2
  echo '変換したい CP932.txt は、標準入力から入力してください' 1>&2
  exit 1
fi

odFake(){

LANG=C

# dec001 - dec255
eval "`printf "
dec001='\001' ; dec002='\002' ; dec003='\003' ; dec004='\004' ; 
dec005='\005' ; dec006='\006' ; dec007='\007' ; dec008='\010' ; 
dec009='\011' ; dec010='\012' ; dec011='\013' ; dec012='\014' ; 
dec013='\015' ; dec014='\016' ; dec015='\017' ; dec016='\020' ; 
dec017='\021' ; dec018='\022' ; dec019='\023' ; dec020='\024' ; 
dec021='\025' ; dec022='\026' ; dec023='\027' ; dec024='\030' ; 
dec025='\031' ; dec026='\032' ; dec027='\033' ; dec028='\034' ; 
dec029='\035' ; dec030='\036' ; dec031='\037' ; dec032='\040' ; 
dec033='\041' ; dec034='\042' ; dec035='\043' ; dec036='\044' ; 
dec037='\045' ; dec038='\046' ; dec039="'"\047"'" ; dec040='\050' ; 
dec041='\051' ; dec042='\052' ; dec043='\053' ; dec044='\054' ; 
dec045='\055' ; dec046='\056' ; dec047='\057' ; dec048='\060' ; 
dec049='\061' ; dec050='\062' ; dec051='\063' ; dec052='\064' ; 
dec053='\065' ; dec054='\066' ; dec055='\067' ; dec056='\070' ; 
dec057='\071' ; dec058='\072' ; dec059='\073' ; dec060='\074' ; 
dec061='\075' ; dec062='\076' ; dec063='\077' ; dec064='\100' ; 
dec065='\101' ; dec066='\102' ; dec067='\103' ; dec068='\104' ; 
dec069='\105' ; dec070='\106' ; dec071='\107' ; dec072='\110' ; 
dec073='\111' ; dec074='\112' ; dec075='\113' ; dec076='\114' ; 
dec077='\115' ; dec078='\116' ; dec079='\117' ; dec080='\120' ; 
dec081='\121' ; dec082='\122' ; dec083='\123' ; dec084='\124' ; 
dec085='\125' ; dec086='\126' ; dec087='\127' ; dec088='\130' ; 
dec089='\131' ; dec090='\132' ; dec091='\133' ; dec092='\134' ; 
dec093='\135' ; dec094='\136' ; dec095='\137' ; dec096='\140' ; 
dec097='\141' ; dec098='\142' ; dec099='\143' ; dec100='\144' ; 
dec101='\145' ; dec102='\146' ; dec103='\147' ; dec104='\150' ; 
dec105='\151' ; dec106='\152' ; dec107='\153' ; dec108='\154' ; 
dec109='\155' ; dec110='\156' ; dec111='\157' ; dec112='\160' ; 
dec113='\161' ; dec114='\162' ; dec115='\163' ; dec116='\164' ; 
dec117='\165' ; dec118='\166' ; dec119='\167' ; dec120='\170' ; 
dec121='\171' ; dec122='\172' ; dec123='\173' ; dec124='\174' ; 
dec125='\175' ; dec126='\176' ; dec127='\177' ; dec128='\200' ; 
dec129='\201' ; dec130='\202' ; dec131='\203' ; dec132='\204' ; 
dec133='\205' ; dec134='\206' ; dec135='\207' ; dec136='\210' ; 
dec137='\211' ; dec138='\212' ; dec139='\213' ; dec140='\214' ; 
dec141='\215' ; dec142='\216' ; dec143='\217' ; dec144='\220' ; 
dec145='\221' ; dec146='\222' ; dec147='\223' ; dec148='\224' ; 
dec149='\225' ; dec150='\226' ; dec151='\227' ; dec152='\230' ; 
dec153='\231' ; dec154='\232' ; dec155='\233' ; dec156='\234' ; 
dec157='\235' ; dec158='\236' ; dec159='\237' ; dec160='\240' ; 
dec161='\241' ; dec162='\242' ; dec163='\243' ; dec164='\244' ; 
dec165='\245' ; dec166='\246' ; dec167='\247' ; dec168='\250' ; 
dec169='\251' ; dec170='\252' ; dec171='\253' ; dec172='\254' ; 
dec173='\255' ; dec174='\256' ; dec175='\257' ; dec176='\260' ; 
dec177='\261' ; dec178='\262' ; dec179='\263' ; dec180='\264' ; 
dec181='\265' ; dec182='\266' ; dec183='\267' ; dec184='\270' ; 
dec185='\271' ; dec186='\272' ; dec187='\273' ; dec188='\274' ; 
dec189='\275' ; dec190='\276' ; dec191='\277' ; dec192='\300' ; 
dec193='\301' ; dec194='\302' ; dec195='\303' ; dec196='\304' ; 
dec197='\305' ; dec198='\306' ; dec199='\307' ; dec200='\310' ; 
dec201='\311' ; dec202='\312' ; dec203='\313' ; dec204='\314' ; 
dec205='\315' ; dec206='\316' ; dec207='\317' ; dec208='\320' ; 
dec209='\321' ; dec210='\322' ; dec211='\323' ; dec212='\324' ; 
dec213='\325' ; dec214='\326' ; dec215='\327' ; dec216='\330' ; 
dec217='\331' ; dec218='\332' ; dec219='\333' ; dec220='\334' ; 
dec221='\335' ; dec222='\336' ; dec223='\337' ; dec224='\340' ; 
dec225='\341' ; dec226='\342' ; dec227='\343' ; dec228='\344' ; 
dec229='\345' ; dec230='\346' ; dec231='\347' ; dec232='\350' ; 
dec233='\351' ; dec234='\352' ; dec235='\353' ; dec236='\354' ; 
dec237='\355' ; dec238='\356' ; dec239='\357' ; dec240='\360' ; 
dec241='\361' ; dec242='\362' ; dec243='\363' ; dec244='\364' ; 
dec245='\365' ; dec246='\366' ; dec247='\367' ; dec248='\370' ; 
dec249='\371' ; dec250='\372' ; dec251='\373' ; dec252='\374' ; 
dec253='\375' ; dec254='\376' ; dec255='\377' ; 
"`"

#dec039=\'



while # read で入力を改行ごとに分割するループ

# whileループ開始条件がreadのtrueならば、末尾改行が有る
# readがfalseでも、末尾改行が無いだけで入力内容があるならば、ループを実行する
# どちらのループ開始条件だったのかを記録しておいて、ループ1周の末尾に改行を出力
endOfLineLF='null'

if IFS='' read -r Line
then
  endOfLineLF='true'
  true
elif test -n "${Line}"
then
  endOfLineLF='false'
  true
else
  false
fi

do

while test "${#Line}" -ge 1 # 1行単位のループ
do

case "${Line%"${Line#?}"}" in
( "${dec001}" ) printf ' %s\n' '00000001' ;;
( "${dec002}" ) printf ' %s\n' '00000010' ;;
( "${dec003}" ) printf ' %s\n' '00000011' ;;
( "${dec004}" ) printf ' %s\n' '00000100' ;;
( "${dec005}" ) printf ' %s\n' '00000101' ;;
( "${dec006}" ) printf ' %s\n' '00000110' ;;
( "${dec007}" ) printf ' %s\n' '00000111' ;;
( "${dec008}" ) printf ' %s\n' '00001000' ;;
( "${dec009}" ) printf ' %s\n' '00001001' ;;
( "${dec010}" ) printf ' %s\n' '00001010' ;;
( "${dec011}" ) printf ' %s\n' '00001011' ;;
( "${dec012}" ) printf ' %s\n' '00001100' ;;
( "${dec013}" ) printf ' %s\n' '00001101' ;;
( "${dec014}" ) printf ' %s\n' '00001110' ;;
( "${dec015}" ) printf ' %s\n' '00001111' ;;
( "${dec016}" ) printf ' %s\n' '00010000' ;;
( "${dec017}" ) printf ' %s\n' '00010001' ;;
( "${dec018}" ) printf ' %s\n' '00010010' ;;
( "${dec019}" ) printf ' %s\n' '00010011' ;;
( "${dec020}" ) printf ' %s\n' '00010100' ;;
( "${dec021}" ) printf ' %s\n' '00010101' ;;
( "${dec022}" ) printf ' %s\n' '00010110' ;;
( "${dec023}" ) printf ' %s\n' '00010111' ;;
( "${dec024}" ) printf ' %s\n' '00011000' ;;
( "${dec025}" ) printf ' %s\n' '00011001' ;;
( "${dec026}" ) printf ' %s\n' '00011010' ;;
( "${dec027}" ) printf ' %s\n' '00011011' ;;
( "${dec028}" ) printf ' %s\n' '00011100' ;;
( "${dec029}" ) printf ' %s\n' '00011101' ;;
( "${dec030}" ) printf ' %s\n' '00011110' ;;
( "${dec031}" ) printf ' %s\n' '00011111' ;;
( "${dec032}" ) printf ' %s\n' '00100000' ;;
( "${dec033}" ) printf ' %s\n' '00100001' ;;
( "${dec034}" ) printf ' %s\n' '00100010' ;;
( "${dec035}" ) printf ' %s\n' '00100011' ;;
( "${dec036}" ) printf ' %s\n' '00100100' ;;
( "${dec037}" ) printf ' %s\n' '00100101' ;;
( "${dec038}" ) printf ' %s\n' '00100110' ;;
( "${dec039}" ) printf ' %s\n' '00100111' ;;
( "${dec040}" ) printf ' %s\n' '00101000' ;;
( "${dec041}" ) printf ' %s\n' '00101001' ;;
( "${dec042}" ) printf ' %s\n' '00101010' ;;
( "${dec043}" ) printf ' %s\n' '00101011' ;;
( "${dec044}" ) printf ' %s\n' '00101100' ;;
( "${dec045}" ) printf ' %s\n' '00101101' ;;
( "${dec046}" ) printf ' %s\n' '00101110' ;;
( "${dec047}" ) printf ' %s\n' '00101111' ;;
( "${dec048}" ) printf ' %s\n' '00110000' ;;
( "${dec049}" ) printf ' %s\n' '00110001' ;;
( "${dec050}" ) printf ' %s\n' '00110010' ;;
( "${dec051}" ) printf ' %s\n' '00110011' ;;
( "${dec052}" ) printf ' %s\n' '00110100' ;;
( "${dec053}" ) printf ' %s\n' '00110101' ;;
( "${dec054}" ) printf ' %s\n' '00110110' ;;
( "${dec055}" ) printf ' %s\n' '00110111' ;;
( "${dec056}" ) printf ' %s\n' '00111000' ;;
( "${dec057}" ) printf ' %s\n' '00111001' ;;
( "${dec058}" ) printf ' %s\n' '00111010' ;;
( "${dec059}" ) printf ' %s\n' '00111011' ;;
( "${dec060}" ) printf ' %s\n' '00111100' ;;
( "${dec061}" ) printf ' %s\n' '00111101' ;;
( "${dec062}" ) printf ' %s\n' '00111110' ;;
( "${dec063}" ) printf ' %s\n' '00111111' ;;
( "${dec064}" ) printf ' %s\n' '01000000' ;;
( "${dec065}" ) printf ' %s\n' '01000001' ;;
( "${dec066}" ) printf ' %s\n' '01000010' ;;
( "${dec067}" ) printf ' %s\n' '01000011' ;;
( "${dec068}" ) printf ' %s\n' '01000100' ;;
( "${dec069}" ) printf ' %s\n' '01000101' ;;
( "${dec070}" ) printf ' %s\n' '01000110' ;;
( "${dec071}" ) printf ' %s\n' '01000111' ;;
( "${dec072}" ) printf ' %s\n' '01001000' ;;
( "${dec073}" ) printf ' %s\n' '01001001' ;;
( "${dec074}" ) printf ' %s\n' '01001010' ;;
( "${dec075}" ) printf ' %s\n' '01001011' ;;
( "${dec076}" ) printf ' %s\n' '01001100' ;;
( "${dec077}" ) printf ' %s\n' '01001101' ;;
( "${dec078}" ) printf ' %s\n' '01001110' ;;
( "${dec079}" ) printf ' %s\n' '01001111' ;;
( "${dec080}" ) printf ' %s\n' '01010000' ;;
( "${dec081}" ) printf ' %s\n' '01010001' ;;
( "${dec082}" ) printf ' %s\n' '01010010' ;;
( "${dec083}" ) printf ' %s\n' '01010011' ;;
( "${dec084}" ) printf ' %s\n' '01010100' ;;
( "${dec085}" ) printf ' %s\n' '01010101' ;;
( "${dec086}" ) printf ' %s\n' '01010110' ;;
( "${dec087}" ) printf ' %s\n' '01010111' ;;
( "${dec088}" ) printf ' %s\n' '01011000' ;;
( "${dec089}" ) printf ' %s\n' '01011001' ;;
( "${dec090}" ) printf ' %s\n' '01011010' ;;
( "${dec091}" ) printf ' %s\n' '01011011' ;;
( "${dec092}" ) printf ' %s\n' '01011100' ;;
( "${dec093}" ) printf ' %s\n' '01011101' ;;
( "${dec094}" ) printf ' %s\n' '01011110' ;;
( "${dec095}" ) printf ' %s\n' '01011111' ;;
( "${dec096}" ) printf ' %s\n' '01100000' ;;
( "${dec097}" ) printf ' %s\n' '01100001' ;;
( "${dec098}" ) printf ' %s\n' '01100010' ;;
( "${dec099}" ) printf ' %s\n' '01100011' ;;
( "${dec100}" ) printf ' %s\n' '01100100' ;;
( "${dec101}" ) printf ' %s\n' '01100101' ;;
( "${dec102}" ) printf ' %s\n' '01100110' ;;
( "${dec103}" ) printf ' %s\n' '01100111' ;;
( "${dec104}" ) printf ' %s\n' '01101000' ;;
( "${dec105}" ) printf ' %s\n' '01101001' ;;
( "${dec106}" ) printf ' %s\n' '01101010' ;;
( "${dec107}" ) printf ' %s\n' '01101011' ;;
( "${dec108}" ) printf ' %s\n' '01101100' ;;
( "${dec109}" ) printf ' %s\n' '01101101' ;;
( "${dec110}" ) printf ' %s\n' '01101110' ;;
( "${dec111}" ) printf ' %s\n' '01101111' ;;
( "${dec112}" ) printf ' %s\n' '01110000' ;;
( "${dec113}" ) printf ' %s\n' '01110001' ;;
( "${dec114}" ) printf ' %s\n' '01110010' ;;
( "${dec115}" ) printf ' %s\n' '01110011' ;;
( "${dec116}" ) printf ' %s\n' '01110100' ;;
( "${dec117}" ) printf ' %s\n' '01110101' ;;
( "${dec118}" ) printf ' %s\n' '01110110' ;;
( "${dec119}" ) printf ' %s\n' '01110111' ;;
( "${dec120}" ) printf ' %s\n' '01111000' ;;
( "${dec121}" ) printf ' %s\n' '01111001' ;;
( "${dec122}" ) printf ' %s\n' '01111010' ;;
( "${dec123}" ) printf ' %s\n' '01111011' ;;
( "${dec124}" ) printf ' %s\n' '01111100' ;;
( "${dec125}" ) printf ' %s\n' '01111101' ;;
( "${dec126}" ) printf ' %s\n' '01111110' ;;
( "${dec127}" ) printf ' %s\n' '01111111' ;;
( "${dec128}" ) printf ' %s\n' '10000000' ;;
( "${dec129}" ) printf ' %s\n' '10000001' ;;
( "${dec130}" ) printf ' %s\n' '10000010' ;;
( "${dec131}" ) printf ' %s\n' '10000011' ;;
( "${dec132}" ) printf ' %s\n' '10000100' ;;
( "${dec133}" ) printf ' %s\n' '10000101' ;;
( "${dec134}" ) printf ' %s\n' '10000110' ;;
( "${dec135}" ) printf ' %s\n' '10000111' ;;
( "${dec136}" ) printf ' %s\n' '10001000' ;;
( "${dec137}" ) printf ' %s\n' '10001001' ;;
( "${dec138}" ) printf ' %s\n' '10001010' ;;
( "${dec139}" ) printf ' %s\n' '10001011' ;;
( "${dec140}" ) printf ' %s\n' '10001100' ;;
( "${dec141}" ) printf ' %s\n' '10001101' ;;
( "${dec142}" ) printf ' %s\n' '10001110' ;;
( "${dec143}" ) printf ' %s\n' '10001111' ;;
( "${dec144}" ) printf ' %s\n' '10010000' ;;
( "${dec145}" ) printf ' %s\n' '10010001' ;;
( "${dec146}" ) printf ' %s\n' '10010010' ;;
( "${dec147}" ) printf ' %s\n' '10010011' ;;
( "${dec148}" ) printf ' %s\n' '10010100' ;;
( "${dec149}" ) printf ' %s\n' '10010101' ;;
( "${dec150}" ) printf ' %s\n' '10010110' ;;
( "${dec151}" ) printf ' %s\n' '10010111' ;;
( "${dec152}" ) printf ' %s\n' '10011000' ;;
( "${dec153}" ) printf ' %s\n' '10011001' ;;
( "${dec154}" ) printf ' %s\n' '10011010' ;;
( "${dec155}" ) printf ' %s\n' '10011011' ;;
( "${dec156}" ) printf ' %s\n' '10011100' ;;
( "${dec157}" ) printf ' %s\n' '10011101' ;;
( "${dec158}" ) printf ' %s\n' '10011110' ;;
( "${dec159}" ) printf ' %s\n' '10011111' ;;
( "${dec160}" ) printf ' %s\n' '10100000' ;;
( "${dec161}" ) printf ' %s\n' '10100001' ;;
( "${dec162}" ) printf ' %s\n' '10100010' ;;
( "${dec163}" ) printf ' %s\n' '10100011' ;;
( "${dec164}" ) printf ' %s\n' '10100100' ;;
( "${dec165}" ) printf ' %s\n' '10100101' ;;
( "${dec166}" ) printf ' %s\n' '10100110' ;;
( "${dec167}" ) printf ' %s\n' '10100111' ;;
( "${dec168}" ) printf ' %s\n' '10101000' ;;
( "${dec169}" ) printf ' %s\n' '10101001' ;;
( "${dec170}" ) printf ' %s\n' '10101010' ;;
( "${dec171}" ) printf ' %s\n' '10101011' ;;
( "${dec172}" ) printf ' %s\n' '10101100' ;;
( "${dec173}" ) printf ' %s\n' '10101101' ;;
( "${dec174}" ) printf ' %s\n' '10101110' ;;
( "${dec175}" ) printf ' %s\n' '10101111' ;;
( "${dec176}" ) printf ' %s\n' '10110000' ;;
( "${dec177}" ) printf ' %s\n' '10110001' ;;
( "${dec178}" ) printf ' %s\n' '10110010' ;;
( "${dec179}" ) printf ' %s\n' '10110011' ;;
( "${dec180}" ) printf ' %s\n' '10110100' ;;
( "${dec181}" ) printf ' %s\n' '10110101' ;;
( "${dec182}" ) printf ' %s\n' '10110110' ;;
( "${dec183}" ) printf ' %s\n' '10110111' ;;
( "${dec184}" ) printf ' %s\n' '10111000' ;;
( "${dec185}" ) printf ' %s\n' '10111001' ;;
( "${dec186}" ) printf ' %s\n' '10111010' ;;
( "${dec187}" ) printf ' %s\n' '10111011' ;;
( "${dec188}" ) printf ' %s\n' '10111100' ;;
( "${dec189}" ) printf ' %s\n' '10111101' ;;
( "${dec190}" ) printf ' %s\n' '10111110' ;;
( "${dec191}" ) printf ' %s\n' '10111111' ;;
( "${dec192}" ) printf ' %s\n' '11000000' ;;
( "${dec193}" ) printf ' %s\n' '11000001' ;;
( "${dec194}" ) printf ' %s\n' '11000010' ;;
( "${dec195}" ) printf ' %s\n' '11000011' ;;
( "${dec196}" ) printf ' %s\n' '11000100' ;;
( "${dec197}" ) printf ' %s\n' '11000101' ;;
( "${dec198}" ) printf ' %s\n' '11000110' ;;
( "${dec199}" ) printf ' %s\n' '11000111' ;;
( "${dec200}" ) printf ' %s\n' '11001000' ;;
( "${dec201}" ) printf ' %s\n' '11001001' ;;
( "${dec202}" ) printf ' %s\n' '11001010' ;;
( "${dec203}" ) printf ' %s\n' '11001011' ;;
( "${dec204}" ) printf ' %s\n' '11001100' ;;
( "${dec205}" ) printf ' %s\n' '11001101' ;;
( "${dec206}" ) printf ' %s\n' '11001110' ;;
( "${dec207}" ) printf ' %s\n' '11001111' ;;
( "${dec208}" ) printf ' %s\n' '11010000' ;;
( "${dec209}" ) printf ' %s\n' '11010001' ;;
( "${dec210}" ) printf ' %s\n' '11010010' ;;
( "${dec211}" ) printf ' %s\n' '11010011' ;;
( "${dec212}" ) printf ' %s\n' '11010100' ;;
( "${dec213}" ) printf ' %s\n' '11010101' ;;
( "${dec214}" ) printf ' %s\n' '11010110' ;;
( "${dec215}" ) printf ' %s\n' '11010111' ;;
( "${dec216}" ) printf ' %s\n' '11011000' ;;
( "${dec217}" ) printf ' %s\n' '11011001' ;;
( "${dec218}" ) printf ' %s\n' '11011010' ;;
( "${dec219}" ) printf ' %s\n' '11011011' ;;
( "${dec220}" ) printf ' %s\n' '11011100' ;;
( "${dec221}" ) printf ' %s\n' '11011101' ;;
( "${dec222}" ) printf ' %s\n' '11011110' ;;
( "${dec223}" ) printf ' %s\n' '11011111' ;;
( "${dec224}" ) printf ' %s\n' '11100000' ;;
( "${dec225}" ) printf ' %s\n' '11100001' ;;
( "${dec226}" ) printf ' %s\n' '11100010' ;;
( "${dec227}" ) printf ' %s\n' '11100011' ;;
( "${dec228}" ) printf ' %s\n' '11100100' ;;
( "${dec229}" ) printf ' %s\n' '11100101' ;;
( "${dec230}" ) printf ' %s\n' '11100110' ;;
( "${dec231}" ) printf ' %s\n' '11100111' ;;
( "${dec232}" ) printf ' %s\n' '11101000' ;;
( "${dec233}" ) printf ' %s\n' '11101001' ;;
( "${dec234}" ) printf ' %s\n' '11101010' ;;
( "${dec235}" ) printf ' %s\n' '11101011' ;;
( "${dec236}" ) printf ' %s\n' '11101100' ;;
( "${dec237}" ) printf ' %s\n' '11101101' ;;
( "${dec238}" ) printf ' %s\n' '11101110' ;;
( "${dec239}" ) printf ' %s\n' '11101111' ;;
( "${dec240}" ) printf ' %s\n' '11110000' ;;
( "${dec241}" ) printf ' %s\n' '11110001' ;;
( "${dec242}" ) printf ' %s\n' '11110010' ;;
( "${dec243}" ) printf ' %s\n' '11110011' ;;
( "${dec244}" ) printf ' %s\n' '11110100' ;;
( "${dec245}" ) printf ' %s\n' '11110101' ;;
( "${dec246}" ) printf ' %s\n' '11110110' ;;
( "${dec247}" ) printf ' %s\n' '11110111' ;;
( "${dec248}" ) printf ' %s\n' '11111000' ;;
( "${dec249}" ) printf ' %s\n' '11111001' ;;
( "${dec250}" ) printf ' %s\n' '11111010' ;;
( "${dec251}" ) printf ' %s\n' '11111011' ;;
( "${dec252}" ) printf ' %s\n' '11111100' ;;
( "${dec253}" ) printf ' %s\n' '11111101' ;;
( "${dec254}" ) printf ' %s\n' '11111110' ;;
( "${dec255}" ) printf ' %s\n' '11111111' ;;
( * )
  printf '%s\n' "ERR :${Line%"${Line#?}"}" 1>&2
  return 2
;;
esac

Line="${Line#?}"

done

case "${endOfLineLF}" in
(  true )
printf ' %s\n' '00001010'
#echo true 1>&2 # 【debug】
;;
( false )
true
#echo false 1>&2 # 【debug】
;;
( * )
return 2
;;
esac

done

}

_odFake(){ # fakeではない同等品【debug】

_oct2bin(){ # odFake の代替品にのみ使用
# $1 var
# $2 oct


case "${2:?}" in
( *[!0-7]* )
return 1
;;
esac

set -- "${1}" "${2}" ''

while test "${#2}" -ge 1
do
# 下1桁のみ2進へ変換
case "${2#"${2%?}"}" in
( 0 ) set -- "${1}" "${2%?}" "000${3}" ;;
( 1 ) set -- "${1}" "${2%?}" "001${3}" ;;
( 2 ) set -- "${1}" "${2%?}" "010${3}" ;;
( 3 ) set -- "${1}" "${2%?}" "011${3}" ;;
( 4 ) set -- "${1}" "${2%?}" "100${3}" ;;
( 5 ) set -- "${1}" "${2%?}" "101${3}" ;;
( 6 ) set -- "${1}" "${2%?}" "110${3}" ;;
( 7 ) set -- "${1}" "${2%?}" "111${3}" ;;
esac
done

eval "${1}"'="${3}"'
return # 0の明示は禁止
}

od -to1 -An -v -w1 | {
while read LL
do
if _oct2bin LL "${LL}"
then true
else return 2
fi
LL="00000000${LL}"
LL="${LL#"${LL%????????}"}"
echo " ${LL}"
done
}
}


cp932bitToCharBits(){

# 0x7f = 0111 1111 = o177
# 0x80 = 1000 0000 = o200  2-1byte
# 0x81 = 1000 0001 = o201  2-1
# 0x9f = 1001 1111 = o237  2-1
# 0xa0 = 1010 0000 = o238

# 0xdf = 1101 1111 = o337
# 0xe0 = 1110 0000 = o340  2-1
# 0xfc = 1111 1100 = o374  2-1
# 0xff = 1111 1111 = o377

preBits=''

while read currentBits
do

case "${preBits}" in
( '' )
  true
;;
( * )
echo "${preBits}""${currentBits}"
preBits=''
continue

;;
esac

case "${currentBits%?????}" in
( 100 | 111 ) # 2byte文字の1byte目
preBits="${currentBits}"
continue

;;
( * ) # 1byte文字
echo "${currentBits}"

;;
esac
done

}

cp932charBitsToUtf8(){
# 要
# bin2hex
# printfEscUoct

while read cp932Bits
do

if bin2hex cp932Hex "${cp932Bits}"
then true
else return 1
fi

eval 'CPs="${cp932_'${cp932Hex}'}"'


while test -n "${CPs}"
do

aCP="${CPs%%[ 	]*}"
CPs="${CPs#"${aCP}"}"
CPs="${CPs#"${CPs%%[! 	]*}"}"


if printfEscUoct aCPesc "${aCP}"
then printf "${aCPesc}"
else return 1
fi

#printf '\U'"${aCP}" # 【debug bash】

done

done
}

bin2hex(){
# $1 var
# $2 bin

case "${2:?}" in
( *[!01]* )
return 1
;;
esac

set -- "${1}" "${2}" ''

while test $(( ${#2} % 4 )) -ne 0
do
set -- "${1}" "0${2}" ''
done


while test "${#2}" -ge 4
do
case "${2#"${2%????}"}" in
( 0000 ) set -- "${1}" "${2%????}" "0${3}" ;;
( 0001 ) set -- "${1}" "${2%????}" "1${3}" ;;
( 0010 ) set -- "${1}" "${2%????}" "2${3}" ;;
( 0011 ) set -- "${1}" "${2%????}" "3${3}" ;;
( 0100 ) set -- "${1}" "${2%????}" "4${3}" ;;
( 0101 ) set -- "${1}" "${2%????}" "5${3}" ;;
( 0110 ) set -- "${1}" "${2%????}" "6${3}" ;;
( 0111 ) set -- "${1}" "${2%????}" "7${3}" ;;
( 1000 ) set -- "${1}" "${2%????}" "8${3}" ;;
( 1001 ) set -- "${1}" "${2%????}" "9${3}" ;;
( 1010 ) set -- "${1}" "${2%????}" "a${3}" ;;
( 1011 ) set -- "${1}" "${2%????}" "b${3}" ;;
( 1100 ) set -- "${1}" "${2%????}" "c${3}" ;;
( 1101 ) set -- "${1}" "${2%????}" "d${3}" ;;
( 1110 ) set -- "${1}" "${2%????}" "e${3}" ;;
( 1111 ) set -- "${1}" "${2%????}" "f${3}" ;;
esac
done

eval "${1}"'="${3}"'
return # 0の明示は禁止
}

printfEscUoct(){

if eval 'hex2bin '"${1}"' "${2}"'
then true
else return 1
fi

if eval 'UnicodeCP2utf8bin '"${1}"' "${'"${1}"'}"'
then true
else return 1
fi

if eval 'bin2escOct '"${1}"' "${'"${1}"'}"'
then return 0
else return 1
fi

}

hex2bin(){
# $1 var
# $2 hex


case "${2:?}" in
( *[!0-9a-fA-F]* )
return 1
;;
esac

set -- "${1}" "${2}" ''

while test "${#2}" -ge 1
do
# 下1桁のみ2進へ変換
case "${2#"${2%?}"}" in
( 0    ) set -- "${1}" "${2%?}" "0000${3}" ;;
( 1    ) set -- "${1}" "${2%?}" "0001${3}" ;;
( 2    ) set -- "${1}" "${2%?}" "0010${3}" ;;
( 3    ) set -- "${1}" "${2%?}" "0011${3}" ;;
( 4    ) set -- "${1}" "${2%?}" "0100${3}" ;;
( 5    ) set -- "${1}" "${2%?}" "0101${3}" ;;
( 6    ) set -- "${1}" "${2%?}" "0110${3}" ;;
( 7    ) set -- "${1}" "${2%?}" "0111${3}" ;;
( 8    ) set -- "${1}" "${2%?}" "1000${3}" ;;
( 9    ) set -- "${1}" "${2%?}" "1001${3}" ;;
( [aA] ) set -- "${1}" "${2%?}" "1010${3}" ;;
( [bB] ) set -- "${1}" "${2%?}" "1011${3}" ;;
( [cC] ) set -- "${1}" "${2%?}" "1100${3}" ;;
( [dD] ) set -- "${1}" "${2%?}" "1101${3}" ;;
( [eE] ) set -- "${1}" "${2%?}" "1110${3}" ;;
( [fF] ) set -- "${1}" "${2%?}" "1111${3}" ;;
esac
done

eval "${1}"'="${3}"'
return # 0の明示は禁止
}

UnicodeCP2utf8bin(){ # 2025-05-03
# $1 var
# $2 Unicode CodePoint(bin) 8bit-24bit 区切り空白禁止

if
eval "${1}"'="null"'
then true
else return 1
fi

case "${2:?}" in
( *[!01]* )
return 1
;;
esac

# 1byte
#   0000-       0 0000 0000 0000 0000 0000
#          007f 0 0000 0000 0000 0111 1111
# 2byte
#   0080-       0 0000 0000 0000 1000 0000
#          07ff 0 0000 0000 0111 1111 1111
# 3byte
#   0800-       0 0000 0000 1000 0000 0000
#          ffff 0 0000 1111 1111 1111 1111
# 4byte
#  10000-       0 0001 0000 0000 0000 0000
#        10ffff 1 0000 1111 1111 1111 1111

# codePoint(bin) -> 21bit
set -- "${1}" "00000000000000000000${2}"
set -- "${1}" "${2#"${2%?????????????????????}"}"

# $@  var , codePoint(21bit)
case "${2%????????????????}" in
( 00000 )
set -- "${1}" "${2#"00000"}" # ↓↓ 残り16bit

;;
( * ) # U+010000 - U+10FFFF

# $@ var , codePoint(21bit) , codePoint上位5bit
set -- "${1}" "${2}" "${2%????????????????}"
set -- "${1}" "${2}" "${3#${3%%1*}}"

# 0x10 = 00001 0000
if test "${3}" -le 10000
then true 
else return 1
fi

# x10ffff = 1 0000 1111 1111 1111 1111
# 11110(3) 10(6) 10(6) 10(6)
# $@  var , 21-1
#       var             21-19              18-1          12-1                 6-1
set -- "${1}" "${2%??????????????????}" "${2#???}" "${2#?????????}" "${2#???????????????}"
#       var      21-19              18-13               12-7        6-1
set -- "${1}" "11110${2}" "10${3%????????????}" "10${4%??????}" "10${5}"

#printf "${2}${3}${4}${5}" 1>&2 # 【debug】
eval "${1}"'="${2}${3}${4}${5}"'
return 0

;;
esac

# $@ var , codePoint(16bit)
case "${2%???????????}" in
( 00000 )
set -- "${1}" "${2#"00000"}" # ↓↓ 残り11bit

;;
( * ) # U+0800 - U+ffff
# $@  var , 16-1
# 1110(4) 10(6) 10(6)
#        var         16-13            12-1            6-1
set -- "${1}" "${2%????????????}" "${2#????}" "${2#??????????}"
#        var       16-13        12-7        6-1
set -- "${1}" "1110${2}" "10${3%??????}" "10${4}"

#printf "${2}${3}${4}" # 【debug】
eval "${1}"'="${2}${3}${4}"'
return 0

;;
esac

# $@ var , codePoint(11bit)
# 0x7f = 000 0111 1111
# 0x80 = 000 1000 0000
case "${2%???????}" in
( 0000 ) # U+0000 - U+007f

set -- "${1}" "${2#"0000"}"
eval "${1}"'="${2}"'
return 0

;;
( * ) # U+0080 - U+07ff
# 110(5) 10(6)
# 0x07ff= 00000111 11111111
# $@ var , 11-1
#       var          11-7            6-1
set -- "${1}" "110${2%??????}" "10${2#?????}"

#printf "${2}${3}" # 【debug】
eval "${1}"'="${2}${3}"'
return 0

;;
esac

return 2
}

bin2escOct(){ # 2025-05-03
# bin を \ooo\ooo ...の形式に変換
# $1 var
# $2 bin

case "${2:?}" in
( *[!0]* )
true
;;
( * ) # 0,00,000,...
eval "${1}"'="\\000"'
return  # return 0 はNG
;;
esac

case "${2}" in
( *[!01]* )
return 1
;;
esac

#       var       ゼロtrim(bin)
set -- "${1}" "${2#"${2%%[!0]*}"}"

while test $(( ${#2} % 8 )) -ne 0
do
set -- "${1}" "0${2}"
done
set -- "${1}" "${2}" '' '' "${2}"

while test "${#5}" -ge 8  # 8bit x 1 loop
do
#        var   0        8bit              \ooo     8bit trim
set -- "${1}" "0${2#"${2%????????}"}" '' "${4}" "${5%????????}"

while test "${#2}" -ge 3
do
case "${2#"${2%???}"}" in
( 000 ) set -- "${1}" "${2%???}" "0${3}" "${4}" "${5}" ;;
( 001 ) set -- "${1}" "${2%???}" "1${3}" "${4}" "${5}" ;;
( 010 ) set -- "${1}" "${2%???}" "2${3}" "${4}" "${5}" ;;
( 011 ) set -- "${1}" "${2%???}" "3${3}" "${4}" "${5}" ;;
( 100 ) set -- "${1}" "${2%???}" "4${3}" "${4}" "${5}" ;;
( 101 ) set -- "${1}" "${2%???}" "5${3}" "${4}" "${5}" ;;
( 110 ) set -- "${1}" "${2%???}" "6${3}" "${4}" "${5}" ;;
( 111 ) set -- "${1}" "${2%???}" "7${3}" "${4}" "${5}" ;;
esac
done

set -- "${1}" "${5}" '' '\'"${3}${4}" "${5}"

done

eval "${1}"'="${4}"'
return # 0の明示は禁止
}

{
# CP932.txt -> 00110001 \n 00110010 \n 00001101 ....
odFake
#_odFake # 【debug】
} | {
# 1バイト文字と2バイト文字の判定
cp932bitToCharBits
#cat # 【debug】
} | {
# UTF32に変換,printf \UXXXX 相当
cp932charBitsToUtf8
#cat # 【debug】
}

cp932_09="09"
cp932_0a="0a"
cp932_0d="0d"
cp932_20="20"
cp932_21="21"
cp932_22="22"
cp932_23="23"
cp932_24="24"
cp932_25="25"
cp932_26="26"
cp932_27="27"

cp932_fc47="9d70"
cp932_fc48="9d6b"
cp932_fc49="fa2d"
cp932_fc4a="9e19"
cp932_fc4b="9ed1"