シェルワンライナー160本ノック問題83
問題83 Shift_JISをそのままechoするシェルスクリプト
問題のファイルは
https://github.com/shellgei/shellgei160
からダウンロードできる。
文字コードがわけわからなさ過ぎてものすごい時間がかかった。アルファベットと数字に関してはどの文字コードでもバイト列が同じということがわからなくて苦戦した。
解答例は
cat soleil.bash | sed 's/\\/\\\\/g' > new_soleil.bash
である。
Shift_JISは文字を2バイトで表すが、そのとき2バイト目のバイト列がほかの文字と同じになることがあるため、UTF-8などほかの文字コードで解釈されるような状況だとエラーの原因となる。例えば「ソ」はShift_JISだと0x835cだが、この0x5cというのが曲者でここだけ取り出してみるとバックスラッシュのASCIIコードと同じになっている。ほかにも0x5cを含む文字というのはたくさんある。解答例ではバックスラッシュを増やして echo で0x5cが欠落しないように工夫した。