【MQL4定数】文字コードの定数​(CP_○○)

【辞書】MQLリファレンス

文字コードの定数(CP_○○)

文字コードの定数は、文字コードを指定したいときに使用します。

文字コードを指定しない場合は、自動的にWindowsOSのANSI(CP_ACP)の文字コードが使用されます。

MQL4のプログラミングでは、文字コードを変換する場合はほとんどないので、文字コードは特に指定する必要はありません。

しかし、OSが変わった時に文字化けなどの不具合が出ることがあります。

その時に文字コードを指定すると良いでしょう。

文字コードを指定できる関数は以下の通りです。

これらの関数の引数として、文字コードの定数が使用されます。

  • CharArrayToString
  • StringToCharArray
  • FileOpen

 

文字コードの定数(CP_○○)

定数数値説明
CP_ACP0WindowsANSIコードページ
CP_OEMCP1現在のシステムのOEMコードページ
CP_MACCP2Macintoshコードページ
CP_THREAD_ACP3現在のスレッド用のWindowsANSIコードページ
CP_SYMBOL42シンボルコードページ
CP_UTF765000UTF-7コードページ
CP_UTF865001UTF-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ファイルを書き出しています。