「GraphMaker」の続編かと思わせておいて、肩透かしを食らわせてすみません。

実はGraphMakerを作っていて、「べき乗」をあらわすための「上付き文字」や「ルート記号」を書きたかったのですが、それらを入れた文字列、

 

    WCHAR str[] = L"y = ax + b\r\ny = ax² + bx + c\r\ny = ax³ + bx² + cx + d\r\ny = +-√(ax² - b)";
 

を書くことはできるのですが、それを普通のテキストファイル(Shift JIS)でセーブすると文字化けを起こして保存できません。

 

    WCHAR str[] = L"y = ax + b\r\ny = ax? + bx + c\r\ny = ax? + bx? + cx + d\r\ny = +-√(ax? - b)";

 

しかし、今までbcc32c.exeにはShift JIS(要すればANSI)コードしか食わせたことがなく、果たして、

「Windowsのネイティブな文字コード(WCHAR)であるUTF-16や(今やネットの標準である)UTF-8の形式で保存したテキストファイルをコンパイラーが正しく処理できるのか?」

という疑問が生じました。(正しく読み込めなければ、キーワードやトークンであればシンタックスエラー等になり、コンパイルできなくなることが予想されます。)

 

When doubt, check it!

 

の方針に基づき、ウィンドウベースでユニコード記号を使った簡単なサンプルプログラムを作り、

 

/////////////
// Test.cpp
/////////////
#define        STRICT
#include    <windows.h>
#include    <wchar.h>
#include    <string.h>

////////////////
// WinMain関数
////////////////
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPWSTR lpCmdLine, int nCmdShow) {

    WCHAR str[] = L"y = ax + b\r\ny = ax
² + bx + c\r\ny = ax³ + bx² + cx + d\r\ny = +-(ax² - b)";
    MessageBoxW(0, str, L"Unicode 文字列表示テスト", MB_OK | MB_ICONINFORMATION);

    return 0L;
}

 

bcc32c.exeに喰わせてみました。その結果、

【Shift JIS】

当たり前ですが文字化けします。(ルート記号はSJISも使えるのか、パスしますね。)

 

【UTF-8】

やたーっ!!ちゃんとコンパイルできました!なので、Unicode記号を使った文字列を有するプログラムはUTF-8形式でセーブすればbcc32c.exeでコンパイル可能です。しかし、...

 

【UTF-16】

UTF-16は失敗しました。膨大な量の「~」文字が表示され、一見1、7、9、11、13行に不正文字を使用したように見えますが、それらは↑のソースにある通りコメント記号部分等ですし、5つのエラーで「7つのエラー」と表示されるのもおかしいです。まず、bcc32s.exeはUTF-16ファイルは使えない、と考えた方がよいでしょう。

 

尚、GraphMakerを作成するときは、このようなテストを行っておらず、Shift JISファイルで開発したので、ユニコードの文字化け対策として「文字列をコードで入力」しました。

例:    WCHAR expStr2[21] = {0x0079, 0x0020, 0x003D, 0x0020, 0x0061, 0x0078, 0x00B2, 0x0020, 0x002B, 0x0020, 0x0062, 0x0078, 0x0020, 0x002B, 0x0020, 0x0063, 0x0000};    // WCHAR expStr2[21] = "y = ax² + bx + c";

 

ps. 因みに、「ご本家MicrosoftのC#コンパイラーはどうかな?」と思い、簡単なフォーム(ウィンドウ)を表示するプログラム(Form.cs)をUTF-8とUTF-16形式で保存してコンパイルしましたが、流石Microsoft、何の苦も無くコンパイルできました。