文字定数

MQL5 では文字列の要素としての文字は、Unicode 文字セットのインデックスです。文字は整数にキャスト出来る16 進数値で、加算と減算のような整数演算 によって操作することが出来ます。

引用符内の文字及び「\x10」などの文字の 16 進数の ASCII コードは文字定数で、ushort 型です。例えば、「0」タイプのレコードは、文字のテーブルのインデックス 0 に対応し、数値 30 を持ちます。

例:

void OnStart()
 {
//--- 文字定数を定義する
  int symbol_0='0';
  int symbol_9=symbol_0+9; // 「9」シンボルを取得
//--- 定数の出力値
  printf("In a decimal form: symbol_0 = %d,  symbol_9 = %d",symbol_0,symbol_9);
  printf("In a hexadecimal form: symbol_0 = 0x%x,  symbol_9 = 0x%x",symbol_0,symbol_9);
//--- 文字列に定数を入れる
  string test="";
  StringSetCharacter(test,0,symbol_0);
  StringSetCharacter(test,1,symbol_9);
//--- 文字列で表示する
  Print(test);
 }

バックスラッシュは、コンパイラがプログラムのソーステキスト内の定数文字列と文字定数を扱う際の制御文字です。単一引用符( ' )、二重引用符( " )、バックスラッシュ( \ )及び制御文字などの記号は、以下の表に従って、バックスラッシュ(\)で始まるシンボルの組み合わせとして表すことが出来ます。

文字名

ニーモニックコードや画像

MQL5レコード

数値

改行(ラインフィード)

LF

'\n'

10

水平タブ  

HT

'\t'

9

キャリッジリターン

CR

'\r'

13

バックスラッシュ

\

'\\'

92

単一引用符  

'

'\''

39

二重引用符  

"

'\"'

34

16 進コード

hhhh

'\xhhhh'

1〜4 個の16 進文字

10 進コード

d

'\d'

0〜65,535 の 10 進数

バックスラッシュに上記以外の文字が続く場合、結果は未定義です。

void OnStart()
 {
//--- 文字定数を宣言する
  int a='A';
  int b='$';
  int c='©';     // コード 0xA9
  int d='\xAE';   // シンボル ® のコード
//--- 定数を出力する
  Print(a,b,c,d);
//--- 文字列に文字を追加する
  string test="";
  StringSetCharacter(test,0,a);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,b);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,c);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,d);
  Print(test);
//--- 文字を数として表す
  int a1=65;
  int b1=36;
  int c1=169;
  int d1=174;
//--- 文字列に文字を追加する
  StringSetCharacter(test,1,a1);
  Print(test);
//--- 文字列に文字を追加する
  StringSetCharacter(test,1,b1);
  Print(test);
//--- 文字列に文字を追加する
  StringSetCharacter(test,1,c1);
  Print(test);
//--- 文字列に文字を追加する
  StringSetCharacter(test,1,d1);
  Print(test);
 }

上述されたように、文字定数(または変数)の値は、文字のテーブルのインデックスです。インデックスは整数なので、様々な方法で記述することが出来ます。

void OnStart()
 {
//---
  int a=0xAE;     // ® のコードは '\xAE' リテラルに対応する
  int b=0x24;     // $ のコードは '\x24' リテラルに対応する
  int c=0xA9;     // © のコードは '\xA9' リテラルに対応する
  int d=0x263A;   // ☺ のコードは '\x263A' リテラルに対応する
//--- 値を表示する
  Print(a,b,c,d);
//--- 文字列に文字を追加する
  string test="";
  StringSetCharacter(test,0,a);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,b);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,c);
  Print(test);
//--- 文字列内の文字を置換する
  StringSetCharacter(test,0,d);
  Print(test);
//--- スートのコード
  int a1=0x2660;
  int b1=0x2661;
  int c1=0x2662;
  int d1=0x2663;
//--- スペードの文字を追加する
  StringSetCharacter(test,1,a1);
  Print(test);
//--- ハートの文字を追加する
  StringSetCharacter(test,2,b1);
  Print(test);
//--- ダイヤの文字を追加する
  StringSetCharacter(test,3,c1);
  Print(test);
//--- クラブの文字を追加する
  StringSetCharacter(test,4,d1);
  Print(test);
//--- 文字列内の文字リテラルの例
  test="Queen\x2660Ace\x2662";
  printf("%s",test);
 }

リテラル文字の内部表現は ushort 型です。文字定数は 0 から 6,5535 までの値を受け入れることが出来ます。

参照

StringSetCharacter()StringGetCharacter()ShortToString()ShortArrayToString()StringToShortArray()