UTF-8は2度、3度死ぬ(その2)

この記事は、次の記事の続きです。

連邦に下ったのか、その姿は忍びん

さて、ようやく文字化けせずに、日本語が表示できる様になりました(?)が、引数で試してませんね。と言うわけで、引き続き頑張りましょう。引数を表示するプログラムは、幾らでも転がっているので、掲載は省きます。
取りあえず、バグがないか確認

>gcc main.c
>a.exe aaa bbb ccc
argc=4
argv:
    [0]=a.exe   ( 61 2e 65 78 65 )
    [1]=aaa   ( 61 61 61 )
    [2]=bbb   ( 62 62 62 )
    [3]=ccc   ( 63 63 63 )

ん、大丈夫そうですね。さぁ日本語をと思ったら、IMEが動きません。UTF-8の画面では駄目なのですかね。早々にあきらめて、メモ帳でバッチファイルを作成。
バッチファイルのサンプル(保存形式 UTF-8)

a.exe ああ いい うう


またぁ?なんですかこれ?……どうもメモ帳で書くと、UTF-8のBOM(0xefbbbf)が付くみたいで、バッチファイル(?)は、それを嫌っている様ですね。取りあえず、先頭に改行入れて回避しましょう。

はぁ、なんだか疲れてきましたね〜UTF-8からシフトJISに、寝返っちゃいましたよ、こいつら。

シャクだねぇ…けど今日の所は見逃してあげるよ!

多分、コマンドプロンプト(cmd.exe)が悪さしてるのかな?と、言うわけで、system()関数使ってa.exeを呼び出してみましょう。そうすれば、嫌でもcmd.exe通りますし。
てな訳で、プログラム作る訳ですが、疲れてきたのと、大したものではないので、掲載は省きます。

ん〜こう言うのって前進したって言うんですかね、それとも後退したって言うんですかね?
ちゃんと「system("a.exe ああ いい うう");」ってやってますよ?でも、「いい」と「うう」は、何処へ行っちゃったのでしょうね〜
もう最終手段ですね、cmd.exeも通さずに実行するexec()の出番ですよ。
execのサンプル(保存形式 UTF-8)

#include <stdio.h>
#include <process.h>

int
main()
{
    char*   arg[] = {
        "a.exe",
        "ああ",
        "いい",
        "うう",
        NULL
    };

    printf("EXEC try...\n");
    _flushall();

    _execv(arg[0], (const char* const*)arg);

    fprintf(stderr, "EXEC fail\n");
    return 1;
}


変わらないぞぉぉお?最初のが一番マシか?文字コード違うけど…。引数、日本語取っちゃ駄目なんですかね〜。か、UNICODE使うか??