JAX-RSを使用してRESTfulサービス開発
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}
途中の「//# + ” \ < > ; ‘ ,でない」の処理は独自の要件のものです。
もっと賢くできるやり方があったら知りたいです。