Ansatzの備忘録

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

シェルワンライナー160本ノック問題79

問題79 文字コードの特定

問題のファイルは

https://github.com/shellgei/shellgei160

からダウンロードできる。

わけのわからない記号列を解釈しなおす問題だった。解答を読んでいると、リダイレクトをうまく使っているようだったがほとんど忘れていることばかりだったので復習しないといけない。

解答例は

$ iconv -l | while read c; do iconv -f $c message.txt &> /dev/null && iconv -f $c message.txt 2> /dev/null | grep -qP '\p{Hiragana}|\p{Katakana}|\p{Han}' && echo $c && iconv -f $c message.txt; done

となる。最初に iconv の対応している文字コードすべてを出力した後、一つずつ read で読み込んで再び iconv にテキスト読解用の文字コードとして与えている。このとき &> で標準出力も標準エラー出力もまとめてデブヌルに捨てている。&> は 2>&1 と同じだと bash のマニュアルにはある。エラーの出ない文字コードを絞るのに大事なのは終了ステータスなのでこのようなことをしている。 && でつながった2回目の iconv でもう一度変換を行い、パイプで grep に渡している。このとき 2> でエラー出力を捨てているがこれはやる意味があるのかわからない。エラーの出ないものを絞っているのだから必要ないと思う。実際にこの処理を除いて実行してみたところ何も問題はなかった。grep ではひらがな・カタカナ・漢字のいずれかが含まれているかをチェックして、含まれている場合はその文字コードを出力してまた iconv で変換をしている。これで解読ができるらしい。