(お詫びと訂正)
Windows Serverでrubyがファイルを読み込む際のデフォルトエンコーディングがUTF-8になってて、従来ずっとWindows-31J(SJIS)だと思っていて不思議だったので先日このエントリを書いたのですが、その後の確認の結果、rubyをインストールする際のダイアログで
Use UTF-8 as default external encoding.
という項目にチェックを入れていたためということが判りました。
これ、一つ上の
Associate .rb and .rbw files with this Ruby installation
という項目のチェックを外すついでに、余計なチェックを入れてしまったようです。
なお、コメントで@asmさんからご教示ある通り、この"Use UTF-8.."にチェックを入れた場合は、環境変数RUBYOPTを使ってUTF-8を設定するだけで、レジストリに何か書くなどの挙動はないようなので、インストール後でもここの修正は可能です。
以上、早とちりなエントリを書いてしまって申し訳ありませんでした。
(先日のエントリは、有益なコメントもいただけましたし、以下にこのまま残しておきます)。
概要
Windows用のrubyで外部ファイルを読む場合、rubyのデフォルトエンコードに注意する必要があるようです。
手元のWindowsクライアント(Windows 10)とWindowsサーバ(2016)でrubyの挙動が違っていたのでメモしておきます。クライアントだとWindows-31J(SJIS)でサーバだとUTF-8でした。
なおrubyのバージョンはRubyInstallersのサイトからダウンロードしたもので、
ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
です。
- Windows サーバーの場合
C:>ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
C:\>irb
irb(main):001:0> p Encoding.default_external
#<Encoding:UTF-8>
=> #<Encoding:UTF-8>
- Windows クライアントの場合
C:>ruby -v
ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]
C:\>irb
irb(main):001:0> p Encoding.default_external
#<Encoding:Windows-31J>
=> #<Encoding:Windows-31J>
気づいたきっかけ
SJISのファイルを読んだとき、クライアントPCでは問題のなかったスクリプトがサーバでは文字化けを起こして、あれ? と思って調べたところ上記の通りでした。
「Windows10とWindows Serverだから異なる」のではなく、何か別の原因で異なっているのかもしれませんが、自分には判りませんでした(教えてエライ人)。
問題を起こしたスクリプトは単に
File.read(filename)
と書いていてEncodingを指定していなかったので、これを
File.read(filename, :encoding=>'Windows-31J')
と変更することで当面の問題は解決しました。