setlocale(Windows)

setlocaleも、LinuxWindowsで違う。

setlocale, _wsetlocale | Microsoft Learn
C/C++での日本語文字列の扱い、どうすればよいか - minus9d's diary
標準出力にユニコードを出力させる - わびさびサンプルソース

Linuxでは、

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */
#include <locale.h> /* ロケール */

/* main関数の定義 */
int main(void){

  /* NULL指定 */
  char *loc1 = setlocale(LC_ALL, NULL); /* setlocaleにLC_ALL, NULLを指定. */
  printf("loc1 = %s\n", loc1); /* loc1を出力. */

  /* ""指定 */
  char *loc2 = setlocale(LC_ALL, ""); /* setlocaleにLC_ALL, ""を指定. */
  printf("loc2 = %s\n", loc2); /* loc2を出力. */

  /* "C"指定 */
  char *loc3 = setlocale(LC_ALL, "C"); /* setlocaleにLC_ALL, "C"を指定. */
  printf("loc3 = %s\n", loc3); /* loc3を出力. */

  /* "ja_JP.UTF-8"指定 */
  char *loc4 = setlocale(LC_ALL, "ja_JP.UTF-8"); /* setlocaleにLC_ALL, "ja_JP.UTF-8"を指定. */
  printf("loc4 = %s\n", loc4); /* loc4を出力. */

  /* ここでNULL指定. */
  char *loc5 = setlocale(LC_ALL, NULL); /* setlocaleにLC_ALL, NULLを指定. */
  printf("loc5 = %s\n", loc5); /* loc5を出力. */

  /* ここで""指定. */
  char *loc6 = setlocale(LC_ALL, ""); /* setlocaleにLC_ALL, ""を指定. */
  printf("loc6 = %s\n", loc6); /* loc6を出力. */

  /* "ja_JP.EUC-JP"指定 */
  char *loc7 = setlocale(LC_ALL, "ja_JP.EUC-JP"); /* setlocaleにLC_ALL, "ja_JP.EUC-JP"を指定. */
  printf("loc7 = %s\n", loc7); /* loc7を出力. */

  /* プログラムの終了 */
  return 0;

}

と書くと、

こうなる。
こうなる。

こうなる。
NULLを指定で現在のロケールが返る。
デフォルトは"C"ロケール
""指定は"C"ロケール
UTF-8EUC-JPなど入っているロケール指定も出来る。
一方で、Windowsでは、

と書くと、

こうなる。
こうなる。

NULLを指定で現在のロケールが返る。
デフォルトは"C"ロケール
""指定は"Japanese_Japan.932"
基本的に"C"と"Japanese_Japan.932"しか指定できない。
"Japanese"とか省略形は可。
"UTF-8"とか指定しても失敗する。

Sample/c/setlocale/setlocale_Windows/src/setlocale at master · bg1bgst333/Sample · GitHub