54715


プログラミング超初心者で、Rubyを勉強しています。  
とある本のタスクを３つまで設けられるToDo_listを作る例題をやっています。  
サクラエディタでコードを書き、コマンドプロンプトで実行しています。

コマンドプロンプトで実行中に、１つ目のタスクをひらがな入力しenterを押しても  
２つ目のモード選択に行かず改行になってしまい、もう一度enterを押すと表示されていなかった２つ目のモード選択で入力せずenterを押したと判断され、設定したエラーになってしまいます。半角英数でタスク設定をするとうまくいくのですが。

[code]

    todo_list = [{"締め切り"=>"未設定","タスク"=>"未設定"},{"締め切り"=>"未設定","タスク"=>"未設定"},{"締め切り"=>"未設定","タスク"=>"未設定"}]
    
    puts "【モードを選択】"
    puts "[show]ToDoを確認する"
    puts "[add]ToDoを追加する"
    print "showまたはaddと入力してください→"
    mode = gets.chomp!
    
    if mode == "show"
      puts "【ToDo確認モードを選択しました】"
      puts "現在のToDoはありません"
    elsif mode == "add"
      puts "【ToDo追加モードを選択しました】"
      print"１つ目の締め切りを入力してください→"
      todo_list[0]["締め切り"] = gets.chomp!
      print "１つ目のタスクを入力してください→"
      todo_list[0]["タスク"] = gets.chomp!
    else
      puts "エラーです。プログラムを終了します。"
      exit
    end
    
    
    puts"【モードを選択】"
    puts" [show]ToDoを確認する"
    puts" [add]ToDoを追加する"
    print" showまたはaddと入力してください→"
    mode = gets.chomp!
    
    if mode == "show"
      puts "【ToDo確認モードを選択しました】"
      print "1."
      print todo_list[0]["締め切り"]
      print"までに"
      puts todo_list[0]["タスク"]
      print "2."
    elsif mode == "add"
      puts "【ToDo追加モードを選択しました】"
      print"２つめの締め切りを入力してください→"
      todo_list [1]["締め切り"] = gets.chomp!
      print"２つ目のタスクを入力してください→"
      todo_list[1]["タスク"] = gets.chomp!
    else
      puts "エラーです。プログラムを終了します。"
      exit
    end
    
[/code]

サクラエディタ ver 2.2.0.1  
文字コード UTF-8  
win 10

自分なりに調べましたが、解決に至らずここで初めて質問させて頂きました。  
どなたかご教授お願いいたします。


CC BY-SA 4.0
2019-04-29T15:11:31.297
54578
2019-05-05T04:59:38.730
2019-04-29T16:29:26.737
76
34119
question
ruby
コマンドプロンプトでの改行


[コメントにて解決](https://ja.stackoverflow.com/questions/54578/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%A7%E3%81%AE%E6%94%B9%E8%A1%8C#comment58474_54578)されたようなので、改めて回答として投稿しておきます。

* * *

## 原因

この現象は、 Windows 10 October Update (version 1809) ならびに Windows Server version
1809 で導入された、新しいコンソールにおいて発生する不具合で、出力ストリームに紐づけられた内部的なコードページテーブルの初期化処理に不足があり、
**内部処理でマルチバイト文字を正しく認識出来ないことが原因**
のようです[1](https://social.msdn.microsoft.com/Forums/ja-
JP/3a8a7941-a284-40eb-9588-808c575e7c1b/1249612540124721251912531-1809-12398-os)。

* * *

## 解決策

この不具合の解決策は、以下の 3 つが挙げられます。

### 1\. コンソールにてレガシー コンソールを使用する

上記バージョンからコンソールの仕様が変わり、新しいコンソールが導入されました。今回の不具合は、この新しいコンソールにおいて発生するので、以前のコンソールを使えば問題は解決します。

以前のコンソールは **レガシー コンソール** として残っていますが、これを使用するには、以下のような手順でコンソールの設定を変更する必要があります。

  1. コマンドプロンプトを起動
  2. 「プロパティ」から「レガシー コンソールを使用する」にチェックを入れる
  3. コマンドプロンプトを閉じて再起動する ( パソコン自体の再起動は不要 )

なお、レガシー コンソールを使う場合、 **一部の最新機能が使えなくなる** 点に注意が必要です。

### 2\. アプリケーションの初期化処理などで、明示的にロケールの設定を行なう

問題の不具合は、初期化処理の不足が原因で発生しているので、アプリケーションの初期化処理で `setlocale` 関数等を利用して、
**明示的にロケールの設定を行なう** ことで不具合を解消出来ます。

### 3\. 次期バージョンの OS (19H1) まで待つ

この不具合は既にマイクロソフトが認識しており、次期バージョンで修正される予定となっています。そのため、時期バージョンまで待つことで解決出来ると思います。

また、 KB4490481 (OS Build 17763.404)
以降では既に修正されているという情報があるので、該当の更新プログラムを適用することで解決出来るかもしれません[2](http://www.hitachi-
support.com/alert/us/HWS19-003/index.htm)。

* * *

参考:

  * [バージョン 1809 の OS 上でコンソール出力が正しく表示されない問題について](https://social.msdn.microsoft.com/Forums/ja-JP/3a8a7941-a284-40eb-9588-808c575e7c1b/1249612540124721251912531-1809-12398-os)
  * [Windows(Version 1809)上でコンソール出力が正しく表示されない問題による製品への影響について：製品使用上の注意事項：日立](http://www.hitachi-support.com/alert/us/HWS19-003/index.htm)


CC BY-SA 4.0
2019-05-04T13:08:27.660
54715
2019-05-05T04:59:38.730
2019-05-05T04:59:38.730
32986
32986
54578
answer