「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、何の苦も無くコンパイルできました。


