WindowsユーザーのRubyプログラミングの文字コード煩悩

結論

ライブラリkconvをrequireして「.toutf8」する。これ以外は何もせずcmdに日本語が表示されました。世のなかすべてUTF-8になればいいと思っている。

require "kconv"

system("ping 8.8.8.8 > ping.txt") #ちなみにこの出力はANSI、Shift-JISです。

file = File.read("ping.txt")
file = file.toutf8 #日本語表示

puts file.encoding

#file = file.encode("UTF-8") #文字化け、encodeメソッドの使い方間違えている?

puts file

とりあえずkconvtoutf8を覚えておけばいいね!

文字コード

  • Linuxのシェル文字コードはutf-8
  • Windowsのシェルcmd文字コードはShift-JIS正確にはcp932
  • Rubyのsystemコマンド書き出し文字コードはutf-8。ここは難しいね。下に書きます。

【実験】Rubyスクプリプトでsystemコマンドを使いpingを出力。

system("ping 8.8.8.8 > ping.txt") #日本語で記述される

f = File.read("ping.txt")

puts f #文字化け
puts f.encode("Shift-JIS") #文字化け
puts f.encode("cp932") #文字化け

とにかくcmdの文字コードをUTF-8に変換する。よって、とにかくcmdにて「chcp 65001」コマンドの実行が必要です。

  • 方法1→Rubyスクリプトに書いておく
  • 方法2→Rubyスクリプトを実行する前にcmdで「chcp 65001」を打っておく

方法1

system("chcp 65001")
system("ping 8.8.8.8 > ping.txt") #開いているcmdのchcpに従う、よってテキスト内容は英語

f = File.read("ping.txt")

puts f

日本語でpingを出力したい。

方法2

system("ping 8.8.8.8 > ping.txt") #テキスト内容は日本語

f = File.read("ping.txt")

system("chcp 65001")

puts f

中途半端ですがここで実験終了です。

「kconvでいいじゃん!」

そして後日、「kconvでいいじゃん!」というのを冒頭の結論に書きました。実験を中断した理由です。「toutf8めっちゃラクじゃん!」

しかし収穫もありました。

  • 文字コードを調べるcmd「chcp」
  • 文字コードを変更するcmd「chcp 65001」(utf-8)
  • 文字コードを変更する(戻す)cmd「chcp 932」(cp932、ANSI、Shift-JIS)
  • Rubyのsystem()コマンド

全然関係ない話

言い訳

とりあえず素人プログラマーとしては深追い、探求せず作業の自動化を図ります。kconvのtoutf8で良しとします。そういう人たち増やしたいです。

反論「いやいや中身も知らず、kconvが何をしているかも知らず使っては…」

はい!ごもっともです。ですが、エントリー時点では良してしてください。まずはすそ野を広げたいです。

ある有名な記事では「コンピュータを知りたければOSをUNIXライクにしなさい!」とあります。Linuxですね。しかし、私はWindowsです。bashは継続して学習しております。WSLが十分ではないことも知っています。しかし、優先順位としていまこの瞬間の作業の煩わしさを解消したいです。世の中で解消していってほしいと思います。人を減らしたいです。

Windowsを使っているという現実。

でも目の前にあるのは「Windows」という現実笑。VM入れてLinux、そんなこともできますが、リソースもだし、切り替えが面倒です。日常のエンタメ利用もあるので昔からのWindowsが楽です。喰わず嫌いなだけかもですが。日常利用でストレスは抱えたくないです。自動化でマネタイズができるようになってからLinux頑張りたいです。とりあえずbashは継続します。まずはWindowsでも動くならそれでいいです!Ruby、WSL、cmd、自動化を頑張ります!

エスパー「そんなことしたら雇用はどうなるの?」

それもごもっともです。言いたいことはわかりますし、何とかしたい気持ちもあります。しかし、2次的3次的な影響は他に適任者がいるのではないでしょうか?それを仕事にしている人たちです。ほんとはそういう人たちがちゃんと考えないといけなんです。よって個人目標としては世の中の自動化です。客に不快な想いをさせるレジは要らないんです。「職業に貴賤なし」は平均的な言葉であり、レジは尊い仕事ですが、その中でも上記のようなレジは要らないんですね。ここら辺は永遠のテーマですね。「会社が不正をしてもちゃんと仕事をしている人はいる。だけどやっぱり会社は不正をした。」このループです。よっていっそのことロボットでいいんです。