初歩のシェルスクリプトで遊ぶ[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"