とあるコードで・・・
外部APIと通信しなきゃいけないコードを今まさに書いているんだけど、なんか文字列のパースがうまくいかない。Windowsで元々コーディングしていて、特に問題無く動いていたコードなのでまったく気にしていなかったんだけど、今回のコードはLinuxで動かす必要があるので、Linuxで動かしてみたら文字化けしている。なんでだろうと思って調べてみたら、文字コードの問題だった。
日本語の文字コード
Shift JIS にはそれぞれメーカーの独自拡張があるのは有名で、https://ja.wikipedia.org/wiki/Shift_JIS この辺に詳しく書いてある。
今回ぶち当たったのはマイクロソフトによる拡張で、 ruby において SJIS
を指定すると ShiftJIS
ではなくて、 Windows-31J
になる。https://docs.ruby-lang.org/ja/latest/class/Encoding.html#C_-C-P932 / https://docs.ruby-lang.org/ja/latest/class/Encoding.html#C_-S-H-I-F-T_-J-I-S
ちゃんと調べていれば違うってことは分かるんだけど、ぱっと見SJISってShiftJISの略だと思う・・・じゃん?
実際にはShift JISの方が空間が小さいので、Shift JISとするところをSJISにしても大して問題はないと思うんだけど逆をやっちゃうと文字化けするので注意が必要。いつの時代も日本語文字コードはカオスだ・・・。EUC-JPとかもあるし・・・。