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使うか??