質問するログイン新規登録

回答編集履歴

3

回答の追記

2025/08/24 14:01

投稿

hiroki-o
hiroki-o

スコア1559

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

回答の追記

2025/08/23 08:01

投稿

hiroki-o
hiroki-o

スコア1559

answer CHANGED
@@ -1,4 +1,4 @@
1
- 以下の2環境で確認しました。
1
+ 以下の2環境で確認しました。ソースはUTF-8で保存です。
2
2
 
3
3
  |OS|コンパイラー|PowerShell|
4
4
  |-|-|-|

1

回答の追記

2025/08/23 07:54

投稿

hiroki-o
hiroki-o

スコア1559

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の変換`に対応しています。