Windows C言語 ファイルポインタを UTF-8 で開く

コンピュータ将棋協会の会報の付属についてくる Kif 形式のファイルを、当然のことながら UTF-8 エンコードで読み取ったら文字化け。
.Net Framework では、StreamReader でファイルを開くとき、エンコードを指定するオプションがあるので、Encoding.(GetEncoding(932)) を指定して開くと、文字化けせず、正常に読み取れる。
どうやら、SJIS らしい。

今時 Unicode でエンコードしていないファイルを扱う理由は何だろうかと、いろいろ、試してみた。

[Windows での対応状況]

1.C/C++ では、標準でのファイル出力は、SJIS。
2.C/C++ で、UTF-8 出力をしたいときは、fopen するときに、オプションを “wt, CCS=UTF-8” とする。

下記は、Visual Studio 2017 で、UTF-8 のテキストファイルを出力する場合の例示。
fp1 が、UTF-8 オプションをつけたファイルエンコーディングでの出力。


#include <stdio.h>
#include <wchar.h>

#pragma warning (disable : 4996)

int main(void)
{
FILE *fp1 = fopen("test1.txt", "wt, ccs=UTF-8");
fputws(L"こんにちは\n", fp1);
fclose(fp1);

FILE *fp2 = fopen("test2.txt", "w");
fputs("こんにちは\n", fp2);
fclose(fp2);

return 0;
}

[Linux (CentOS 7) での対応状況]

1.Linux では、標準ではファイル出力のエンコーディングは、UTF-8。
2.試行実験はしていないが、fopen のエンコーディングオプションを、SJIS に変えてあげることもできなくはなさそうな感じ。それほど難しいことではなさそうだが、SJIS にエンコーディングしなければならない事情はそうないので、調査を割愛した。

[気づいたこと。]

管理者ユーザで、Linux を使用しているとき、sudo gcc test.c -o test として、コンパイルする。
実行するとき、ファイルシステムにアクセスするようなコードを書いてなければ、(ただ printf(“Hello”);ぐらいの話だったら、そのまま実行しても何ら問題はない。)
上記例示のように、標準出力を行うプログラムを実行した時に気づいたことだが、
./test では、セグメンテーション違反になる。
root で作った実行ファイルを起動するば、問題はないと思うが、
結果、管理者特権を持っただけのユーザでは、sudo ./test しないと、セグメンテーションフォールトが起きる。
ファイルシステムにアクセスするためには、sudo をつけないといけない。
Security Exception ぐらいのアラートだったら気づきやすかったかもしれないが、
メモリ違反みたいな報告があっても、中々自分のミスに気づきづらい。

コードに自信がないとき、ロジックの間違いだけに注力しがちだが、
管理者特権を使ってファイルを実行することを考えられるゆとりがあれば、ソフトウェア開発も少しははかどりそうな気がする。