回答編集履歴
3
回答の追記
    
        answer	
    CHANGED
    
    | @@ -17,4 +17,15 @@ | |
| 17 17 | 
             
            - fgetwsの入力コードページをsetlocale以外で変更する方法をご存じの方は、教えてください。
         | 
| 18 18 |  | 
| 19 19 | 
             
            あと、このプログラムは、ほとんどのUTF-16はwchar_tが1個で1文字なので、たまたま動作しています。
         | 
| 20 | 
            -
            サロゲートペア文字(wchar_tが2個で1文字)では上手くいかないと思います。
         | 
| 20 | 
            +
            サロゲートペア文字(wchar_tが2個で1文字)では上手くいかないと思います。
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            (追記)
         | 
| 23 | 
            +
            詳細は、melianさんの回答の通りですが、
         | 
| 24 | 
            +
            ```
         | 
| 25 | 
            +
            #include <fcntl.h>
         | 
| 26 | 
            +
            ```
         | 
| 27 | 
            +
            と
         | 
| 28 | 
            +
            ```
         | 
| 29 | 
            +
                _setmode(_fileno(stdin), _O_U8TEXT);
         | 
| 30 | 
            +
            ```
         | 
| 31 | 
            +
            の追加で、65001でも動作します。
         | 
2
回答の追記
    
        answer	
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            以下の2環境で確認しました。
         | 
| 1 | 
            +
            以下の2環境で確認しました。ソースはUTF-8で保存です。
         | 
| 2 2 |  | 
| 3 3 | 
             
            |OS|コンパイラー|PowerShell|
         | 
| 4 4 | 
             
            |-|-|-|
         | 
1
回答の追記
    
        answer	
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 | 
             
            PowerShellのコードページが932(Shift_JIS)のときは、提示されたソースで正しく動作します。
         | 
| 9 9 | 
             
            65001(UTF-8)のときは、提示されたソース、`setlocale(LC_ALL, ".UTF-8");`に変更したソースの両方とも正しく動作しませんでした。
         | 
| 10 10 |  | 
| 11 | 
            -
            (65001に変更するときは`chcp 65001`、932に戻すときは`chcp 932`と打ちます。)
         | 
| 11 | 
            +
            (65001に変更するときは`chcp 65001`、932に戻すときは`chcp 932`と打ちます。確認するときは`chcp`のみです)
         | 
| 12 12 |  | 
| 13 13 | 
             
            おそらくですが、`fgetws`関数の動作が`OS標準のコードページ→UTF-16の変換`のみをサポートしていて、setlocaleが効いていないと思われます。
         | 
| 14 14 | 
             
            コメントの2人とも、LinuxではOS標準のコードページがUTF-8なので、setlocaleがそのままで`UTF-8→UTF-16の変換`に対応しています。
         | 
