初めてのC# いろいろ気づいたこと

PR201のエミュレータとまではいかずとも、文字ピッチや罫線をできるだけ忠実に再現できるかテストした
中で気づいた機能をズラズラっと忘備録してみました。

1.string型にUTF-8文字コード番号で文字を表記して代入したい。
  探すのが結構大変で、海外のページにあった方法です。
    //特殊な予約文字を定義
    byte STR_bai_yoyaku_code = { 0xE2, 0x94, 0xA5 };
    string STR_bai_yoyaku = Encoding.UTF8.GetString(STR_bai_yoyaku_code);
  これで E2 94 A5 の文字を代入できます。

  2文字以上のときは単純にbyte
の配列を
    byte STR_bai_yoyaku_code = { 0xE2, 0x94, 0xA5, 0xE8 ,0xB9 ,0xAC, 0xE2, 0x94, 0xA2 };
    string STR_bai_yoyaku = Encoding.UTF8.GetString(STR_bai_yoyaku_code);
  のようにするだけです。

2.印刷の最小単位は1/300インチスケール
  現在は new PrintPageEventHandler(pd_PrintPage)として描画用に関数pd_PrintPageを用意させるという
  よくわからない印刷方法が .NET 時代は主流のようです。
  e.Graphics.PageUnit = GraphicsUnit.Document
  とすることで描画位置を1と指定したときに1/300インチとなるのが最小の単位でした。

3.UTF-8のstring型をバイト配列にする
    Encoding UTF8Enc = Encoding.GetEncoding("UTF-8");
    byte
bytes = UTF8Enc.GetBytes(moji);
  これでbytesにはUTF-8として入っています。
  1文字のみ変換で半角英数字は以下の条件で判別できます。
    if (bytes[0] >= 0x20 && bytes[0] <= 0x7E)//半角英数字
  半角罫線素片は
    string tmp_str = String.Format("{0:X2}{1:X2}{2:X2}", bytes[0], bytes[1], bytes[2]);
    switch (tmp_str)//半角罫線素片
    {
      case "E29499":
      case "E294A2":
  とずらずらっと書いてきます。このように書くのは、途中途中に全角の罫線が混じっているのがミソですので・・・

4.正規表現の最短マッチ
  <?n/120インチ改行量の設定[05]?> や <?改ページ?> というのがあったときに、種類が何か、
  引数はあるか(この場合05)というのを取得するのに、ORと最短マッチが必要です。
  また、ヒットしたときに()で括った箇所は左から順にm.Groups配列に代入されます。
  具体的には以下のようになります。
    Regex reg = new Regex("<\\?((.*?)\\[(.*?)\\]|.*?)\\?>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    Match m = reg.Match(moji);
while (m.Success)
{
if (m.Groups[2].Length > 0)//【の設定[00]】のタイプ
{
title = (string)m.Groups[2].Value;
title_arg = int.Parse(m.Groups[3].Value);
}
else
{
title = (string)m.Groups[0].Value;
}
switch (title)
{
case "n/120インチ改行量の設定":
this.set_kaigyo_haba_n120(title_arg);
break;
case "<?1/6インチ改行量の指定?>":
this.set_kaigyo_haba_n120(20);
break;
case "<?改ページ?>":
this.set_x0A(); this.set_x0D();
break;
}
m = m.NextMatch();//ここでもm.Successであれば、次の周回で処理
}
}

  m.Groups[0]は全体が入りますが、
    種類 だけのとき m.Groups[1]は1番目の()
    種類 [ ]のとき m.Groups[1]は1番目の()  m.Groups[2]は2番目の()という具合です。
  どちらのパターンかは、m.Groups[2]の長さが0なら[ ]が無い、という判別をしています。
  特に今回、入り子になってしまう使い方をしたのですが、うまく動作することがわかりました。


簡単にですが、C#で気づいたことでした。