初めての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#で気づいたことでした。
中で気づいた機能をズラズラっと忘備録してみました。
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#で気づいたことでした。