めんどくせぇ~~(苦笑
UniCodeの時代やじぃ~.今どき,S-JISの文字種チェックが必要になるとはのぉ
VB6とか,VC++4とか,DELPHI5時代のS-JISチェック,すでに捨てたじぃ
いや,どこかにあるじゃろけど,アーカイブを解凍するのがメンドクサ(爆
某システム向けの,特殊プリンタに流しこむ文字コードが,S-JISで
文字列を切り貼りした時,中途半端に文字列末に全角1バイト目が残ったりでもしたら
機械が誤動作するのは,この業界,周知の事実じゃろしのぉ?
ってことで,C#の文字列(UniCode)を急遽書き起こしてみた
全くチェックしてないじぃ(いや,今から,チェックするけど)
ってことで,バグってたらスマンこってす
- //------------------------
- //sjisの文字種チェック
- //return -1: 文字位置不正
- // -2: byte配列不正
- // -3: それ以外不正
- // 1: 制御文字
- // 2: 一般半角
- // 3: カナ半角
- // 11: 全角1バイト目
- // 12: 全角2バイト目
- // 99: それ以外の文字
- //
- //------------------------
- public static int is_SjisCharType(byte[] buf, int checkloc)
- {
- int result = -3;
- if (buf.Length == 0)
- {
- return -2;
- }
- if ((checkloc < 0) || (checkloc >= buf.Length))
- {
- return -1;
- }
- bool zenkakufl = false;
- for(int i = 0; i < buf.Length; i++)
- {
- byte c = buf[i];
- if (zenkakufl == false) //通常モード
- {
- if ((c >= 0) && (c < 0x20)) //制御コード
- {
- result = 1;
- }
- else if ((c >= 0x20) && (c <= 0x7f)) //一般半角
- {
- result = 2;
- }
- else if (((c >= 0x81) && (c <= 0x9f)) || ((c >= 0xe0) && (c <= 0xfc))) //全角1バイト目
- {
- result = 11;
- zenkakufl = true;
- }
- else if ((c >= 0xa0) && (c <= 0xdf)) //カナ半角
- {
- result = 3;
- }
- else //それ以外の文字
- {
- result = 99;
- }
- }
- else //全角1バイト目モード
- {
- if ((c >= 0x40) && (c <= 0xfc)) //全角2バイト目
- {
- result = 12;
- }
- else //それ以外の文字種
- {
- result = 99;
- }
- zenkakufl = false;
- }
- if (i == checkloc) //指定位置が来たら抜ける
- {
- break;
- }
- }
- return result;
- }
- private void btn_Click(object sender, EventArgs e)
- {
- string st = "aイウ絵男";
- byte[] tmpByteAry = System.Text.Encoding.GetEncoding("Shift_JIS").GetBytes(st); //文字列をS-JISでエンコードし,Byte配列に格納
- int i = classCommonInfo.is_SjisCharType(tmpByteAry, 1); //指定位置の文字種を取得
- MessageBox.Show(i.ToString(), "確認",
- MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
- }