文字コードの定数(CP_○○)
文字コードの定数は、文字コードを指定したいときに使用します。
文字コードを指定しない場合は、自動的にWindowsOSのANSI(CP_ACP)の文字コードが使用されます。
MQL4のプログラミングでは、文字コードを変換する場合はほとんどないので、文字コードは特に指定する必要はありません。
しかし、OSが変わった時に文字化けなどの不具合が出ることがあります。
その時に文字コードを指定すると良いでしょう。
文字コードを指定できる関数は以下の通りです。
これらの関数の引数として、文字コードの定数が使用されます。
- CharArrayToString
- StringToCharArray
- FileOpen
文字コードの定数(CP_○○)
| 定数 | 数値 | 説明 |
| CP_ACP | 0 | WindowsANSIコードページ |
| CP_OEMCP | 1 | 現在のシステムのOEMコードページ |
| CP_MACCP | 2 | Macintoshコードページ |
| CP_THREAD_ACP | 3 | 現在のスレッド用のWindowsANSIコードページ |
| CP_SYMBOL | 42 | シンボルコードページ |
| CP_UTF7 | 65000 | UTF-7コードページ |
| CP_UTF8 | 65001 | UTF-8コードページ |
文字コードの定数(CP_○○)の使い方
文字コードを指定できる関数で使用します。
例えば、StringToCharArray関数で使用する場合は、以下のように使用します。
void OnInit() {
string tmpstr = "ABCDE";
uchar tmparray[];
int copyednum;
ArrayResize(tmparray,6); // 動的配列のサイズを6に変更
copyednum = StringToCharArray(
tmpstr, // コピー元の文字列
tmparray, // コピー先配列
1, // コピー開始する配列インデックス
3, // コピーする文字数
CP_ACP // コードページ:ANSI
);
for ( int icount =0 ; icount < 6 ; icount++ ) {
printf( "tmparray[%d] = %c",icount, tmparray[icount]);
}
Print("コピー数:",copyednum);
}
上記のように記述すると、以下のように表示されます。
tmparray[0] =
tmparray[1] = A
tmparray[2] = B
tmparray[3] = C
tmparray[4] =
tmparray[5] =
コピー数:3
StringToCharArray関数の第5引数にCP_ACPを指定することで、WindowsANSIコードページとして文字列を文字配列にコピーしています。
コピー開始インデックスが1、コピー文字数が3なので、tmparray[1]~tmparray[3]に「A」「B」「C」がコピーされ、それ以外の要素は空になっています。
サンプルプログラム
以下は、文字コードの定数を使ってファイルをUTF-8で開くサンプルです。
//+------------------------------------------------------------------+
//| 文字コード定数サンプル |
//+------------------------------------------------------------------+
void OnInit()
{
// --- StringToCharArray で CP_ACP を使用する例 ---
string srcStr = "ABCDE";
uchar charArray[];
int copiedNum;
ArrayResize(charArray, 6);
copiedNum = StringToCharArray(
srcStr, // コピー元の文字列
charArray, // コピー先配列
1, // コピー開始する配列インデックス
3, // コピーする文字数
CP_ACP // コードページ:Windows ANSI
);
for(int i = 0; i < 6; i++)
{
printf("charArray[%d] = %c", i, charArray[i]);
}
Print("コピー数:", copiedNum);
// --- FileOpen で CP_UTF8 を使用する例 ---
int fileHandle = FileOpen("test_utf8.csv", FILE_WRITE | FILE_CSV | FILE_ANSI, ',', CP_UTF8);
if(fileHandle != INVALID_HANDLE)
{
FileWrite(fileHandle, "名前", "値");
FileWrite(fileHandle, "テスト", 12345);
FileClose(fileHandle);
Print("UTF-8でファイルを書き出しました。");
}
else
{
Print("ファイルオープンに失敗しました。エラー:", GetLastError());
}
}
このサンプルでは、StringToCharArray関数でCP_ACP(Windows ANSIコードページ)を指定して文字列を文字配列にコピーし、FileOpen関数でCP_UTF8(UTF-8コードページ)を指定してCSVファイルを書き出しています。




