質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

3983閲覧

Ruby getsで取得した日本語をWindows PowerShellに表示させたい

b_kazu

総合スコア26

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/04/11 00:51

編集2018/04/11 01:13

次のコードを実行して「日本語」と入力してもそのとおり表示されません。

環境
Ruby 2.4.3p205
Windows10
Windows PowerShell 5.1.16299.251
コード ページ 932 (ANSI/OEM-日本語Shift-JIS)
フォント MSゴシック

test.rb

ruby

1str = gets.chomp 2p str.encoding 3p str

実行結果

PS C:\Users\username\desktop> ruby test.rb 日本語 #<Encoding:UTF-8> "\x93\xFA\x96{\x8C\xEA"

試したこと。
force_encodingメソッドを使っても結果は同じでした。

ruby

1str = gets.chomp.force_encoding("utf-8") 2p str.encoding 3p str

ARGVは入力した文字列のまま表示されます。
Macのターミナルではgetsで取得しても問題なく表示されます。
バイト列と文字列の違いに問題があるのかと思うのですが、やり方がわかりません。

getsで取得した日本語をPower Shellにそのまま表示させるやり方が知りたいのでよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

特に何もする必要ない筈

ruby

1p Encoding.default_external #=> #<Encoding:Windows-31J> 2puts gets #=> 日本語

追記
最新版(v2.5.1)で実験
pで日本語が普通に出てくるから逆に違和感ある

ruby

1str = gets.chomp 2puts "ENV['RUBYOPT'] = #{ENV['RUBYOPT']}" 3puts "__ENCODING__ = #{__ENCODING__} " 4puts "default_external = #{Encoding.default_external.inspect}" 5puts "default_internal = #{Encoding.default_internal.inspect}" 6puts "str.encoding = #{str.encoding.inspect}" 7puts str 8p str

2.5.0

2.4.3でも再現せず

投稿2018/04/11 01:19

編集2018/04/12 01:33
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazto

2018/04/11 01:37

私の手元では、UTF-8になりました。 irb(main):007:0> p Encoding.default_external #<Encoding:UTF-8> rubyのバージョンによるんでしょうかねぇ…?
asm

2018/04/11 01:40

RubyInstaller2の開発がたまにdefault_externalをutf8にする→CJKからissue建てられてrevertってのを何回か繰り返してましたね。。。
asm

2018/04/11 01:48

2,3回みた記憶があったけど 今探したら2.4.1の1回だけだった
b_kazu

2018/04/11 02:27

asmさん、回答ありがとうございます。 上記を試すと私もpは#<Encoding:UTF-8>となり、putsは���{��となります。 今回はkaztoさんの回答、puts str.force_encoding("SJIS")で解決しました。
b_kazu

2018/04/12 00:46

今使っているruby 2.4.3p205 (2017-12-14 revision 61247) [x64-mingw32]は2018-03月にRubyInstaller(https://rubyinstaller.org/)からダウンロードしました。 インストール時に画像のオプション選択はでてきませんでした。なのでそのとき不思議には思いました。
asm

2018/04/12 01:04

Ruby2.4.3-2インストーラーにてオプション選択画面を確認 注意: 2.4系をインストールしたままインストールすると勝手に事前の設定を引き継いでインストールするようです。
b_kazu

2018/04/12 04:21

過去のRubyを全てアンインストールしてから2.5.1をインストールしたらオプション選択画面が出ました。 Add Ruby executables to your PATHにだけチェックしてインストールしましたが、次のようにUTF-8オプションがついています。 PS C:\Users\username\desktop> ruby -v input.rb ruby 2.5.1p57 (2018-03-29 revision 63029) [x64-mingw32] 日本語 ENV['RUBYOPT'] = -Eutf-8 __ENCODING__ = UTF-8 default_external = #<Encoding:UTF-8> default_internal = nil str.encoding = #<Encoding:UTF-8> ���{�� "\x93\xFA\x96{\x8C\xEA" 設定が根強く残るようです。 この先、getsで取得したものを正規表現に使いたいのですが、今テストする限りinvalid multibyte character (ArgumentError)になります。 解決しない場合は別記事で質問します。
asm

2018/04/12 08:04 編集

コンソールから日本語入力するなら削除しちゃっていいと思うんだけどねぇ>RUBYOPT環境変数 いろいろ試行錯誤した結果、魔法の呪文を開発しました。 STDIN.set_encoding Encoding.locale_charmap コレを入力前に入れておけば、ほぼほぼ問題ないでしょう。 STDIN.set_encoding Encoding.locale_charmap, 'UTF-8' の方が便利にはなるが、たまに面倒になりかねないのが欠点
b_kazu

2018/04/13 00:12

いろいろとありがとうございます。 RUBYOPT環境変数を削除したらforce_encodingなしでもputsで表示できました。 また、gets.chomp.encode("utf-8")することで正規表現にも使えました。 普段使っているMac/ターミナル環境で無意識にできていたことがWindowsではできなくて戸惑いました。 IOクラス、文字コード、文字エンコーディングあたりを勉強し直そうと思います。
guest

0

ベストアンサー

pではなく、putsを使用してください。


こちらの手元でも再現しました。
PowerShellの「現在のコードページ」がShift-JISになっているためと考えられます。
以下で日本語にはなるはずです。

Ruby

1puts str.force_encoding("SJIS")

投稿2018/04/11 00:52

編集2018/04/11 01:34
kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

b_kazu

2018/04/11 01:11

kaztoさん 回答ありがとうございます。 putsで試すと次のような「?」マークで表示されます。 ���{�� ちなみにPowerShellのフォントはMSゴシックです。
b_kazu

2018/04/11 02:15

force_encoding("SJIS")で解決しました。 ありがとうございました。 force_encoding("SJIS")を使ったコードでMacのターミナルでも問題なく表示されます。ちょっと頭の中が混乱してますがゆっくり整理してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問