Javaでの文字種チェック処理

mabushiisign

Javaの入力チェックにて、文字種がちょっと複雑なものがあった。
記号、英数、ひらがな、カタカナ、JIS第1水準と第2水準を許可するという要件。

Unicode(UTF-8)のままだは、2バイト文字のチェックが難しい。
なので、1文字ずつgetBytes(“Windows-31J”)した上で範囲チェックする処理を作成した。

1/**
2 * 文字種チェック.
3 * @param target チェック対象文字列
4 * @return 文字種不正 false
5 */
6public static boolean checkChar(final String target){
7 
8    //文字種NGフラグ
9    boolean ngflg;
10 
11    //Stringをchar配列に変換
12    char[] charArray = target.toCharArray();
13 
14    //一文字ずつループ処理
15    for (int i = 0; i < charArray.length; i++) {
16 
17        //エラーフラグをtrueに設定
18        ngflg = true;
19 
20        char c = charArray[i];
21        int targetChar = getSJISByte(c);
22 
23        if((0x8140 <= targetChar) && (targetChar <= 0x8396)) {
24            // 1区~5区:OK
25            if (targetChar != 0x8148) {
26                //?でない
27                ngflg = false;
28            }
29        }
30 
31        if((0x889F <= targetChar) && (targetChar <= 0xEAA4)) {
32            // 16区~84区:OK
33            ngflg = false;
34        }
35 
36        if ((0x20 <= targetChar) && (targetChar <= 0x7E)) {
37            // ASCII
38            if (targetChar != 0x23 && targetChar != 0x2B && targetChar != 0x22
39                    && targetChar != 0x5C && targetChar != 0x3C && targetChar != 0x3E
40                    && targetChar != 0x3B && targetChar != 0x27 && targetChar != 0x2C) {
41                //# + " \ < > ; ' ,でない
42                ngflg = false;
43            }
44        }
45 
46        if (ngflg) {
47            return false;
48        }
49    }
50 
51    return true;
52}
53 
54 
55/**
56 * Shift-JISでバイトに変換する.
57 * @param c 変換対象文字
58 * @return 変換後文字
59 */
60private static int getSJISByte(final char c) {
61 
62    try {
63        //Windows-31Jでbyteに変換
64        byte[] bArray = String.valueOf(c).getBytes("Windows-31J");
65 
66        int targetChar;
67        if (bArray.length == 1) {
68            //1バイト文字
69            targetChar = bArray[0] & 0xFF;
70 
71        } else {
72            //2バイト文字
73            targetChar = ((bArray[0] & 0xFF) << 8) | (bArray[1] & 0xFF);
74 
75        }
76        return targetChar;
77 
78    } catch (Exception e) {
79        return 0;
80    }
81}

途中の「//# + ” \ < > ; ‘ ,でない」の処理は独自の要件のものです。
もっと賢くできるやり方があったら知りたいです。

ABOUT ME
mabushiisign
mabushiisign
B'zとdoaとミスチルと登山が好きな40代のプログラマです。 普段は、SIer企業で働いています。
記事URLをコピーしました