回答編集履歴

1

追加された条件について検証したがたぶん出来なさそうなのでとりあえず調べたことを書き出しておく

2023/12/16 15:05

投稿

SaitoAtsushi
SaitoAtsushi

スコア5466

test CHANGED
@@ -7,3 +7,27 @@
7
7
  ```
8
8
 
9
9
  の一文を追加すればおそらく期待する動作になります。
10
+
11
+ # 追記
12
+
13
+ 標準出力から出力する文字コードはシステムロケールにしたいという条件に対処する方法を調査・検証してみましたが私なりの結論としては MSVCRT はこのような使い方を想定していないか、単純に対応が充分ではない (バグ) ように見えます。 モードの設定などで期待する動作を出来そうな気がしません。
14
+
15
+ 色々と資料を見た感じをおおざっぱに箇条書きするとこんな感じです。
16
+
17
+ - ストリームには三種類のモードがある
18
+ - バイナリモード
19
+ - テキストモード
20
+ - ユニコードモード、これはさらに三種類に分けられる
21
+ - Unicode (UTF-16, BOM が付く)
22
+ - UTF-16LE
23
+ - UTF-8
24
+ - それぞれのモードのストリームにワイド文字出力系関数で出力を試みたときの結果は
25
+ - バイナリモード → UTF-16LE
26
+ - テキストモード → ロケール設定に従う
27
+ - だたし標準出力をこのモードにしたときは何故か出力時にエラーが返る
28
+ - ユニコードモード → ユニコードモードの種類に従う
29
+ - ただしストリームがコンソールに接続されているときは化けないような調整があるっぽい?
30
+
31
+ 需要を考えれば「入出力はユニコードであって欲しいがコンソールでは化けて欲しくない」という場合が多いでしょうからユニコードモードの挙動は望ましいものです。 ただ、コンソールで化けないというのは不自然な場合分けをしているような雰囲気があるので互換性と辻褄を合わせながら需要も満たす無理のある仕組みがあるように見えます。
32
+
33
+ システムロケールの設定に従って出力して欲しいというのが目的であればストリームはテキストモードにしつつロケール設定するのが筋です。 しかしそれが何故か出力時にエラーになるというのが現時点での問題点です。 しかも返ってくるエラーも状況にそぐわない意味不明なものなので対処法を見出せません。