Ansatzの備忘録

勉強したことあるいはふと思い立ったこと

シェルワンライナー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が欠落しないように工夫した。