import java.text.*; import java.util.Hashtable; /** * 日本語かな文字を扱うためのクラスです。 * @author Jomora * @version 2003.07.28 */ public class KanaUtil { /** * Windowsかどうかフラグ */ protected static boolean _windows = System.getProperty("os.name").startsWith("Win"); /** * システムの文字コードはSJISかどうかフラグ */ protected static boolean _sjis = System.getProperty("file.encoding").equals("SJIS"); /** * システムの言語はjaかどうかフラグ */ protected static boolean _ja = System.getProperty("user.language").equals("ja"); /** * 全角文字から半角文字への変換のためのテーブル */ protected static Hashtable f2h; /** * 半角文字 */ protected static char[][] half = { {0x0020}, // {0x0021}, // ! {0x0022}, // " {0x0023}, // # {0x0024}, // $ {0x0025}, // % {0x0026}, // & {0x0027}, // ' {0x0028}, // ( {0x0029}, // ) {0x002a}, // * {0x002b}, // + {0x002c}, // , {0x002d}, // - {0x002e}, // . {0x002f}, // / {0x0030}, // 0 {0x0031}, // 1 {0x0032}, // 2 {0x0033}, // 3 {0x0034}, // 4 {0x0035}, // 5 {0x0036}, // 6 {0x0037}, // 7 {0x0038}, // 8 {0x0039}, // 9 {0x003a}, // : {0x003b}, // ; {0x003c}, // < {0x003d}, // = {0x003e}, // > {0x003f}, // ? {0x0040}, // @ {0x0041}, // A {0x0042}, // B {0x0043}, // C {0x0044}, // D {0x0045}, // E {0x0046}, // F {0x0047}, // G {0x0048}, // H {0x0049}, // I {0x004a}, // J {0x004b}, // K {0x004c}, // L {0x004d}, // M {0x004e}, // N {0x004f}, // O {0x0050}, // P {0x0051}, // Q {0x0052}, // R {0x0053}, // S {0x0054}, // T {0x0055}, // U {0x0056}, // V {0x0057}, // W {0x0058}, // X {0x0059}, // Y {0x005a}, // Z {0x005b}, // [ {0x005c}, // \ {0x005d}, // ] {0x005e}, // ^ {0x005f}, // _ {0x0060}, // ` {0x0061}, // a {0x0062}, // b {0x0063}, // c {0x0064}, // d {0x0065}, // e {0x0066}, // f {0x0067}, // g {0x0068}, // h {0x0069}, // i {0x006a}, // j {0x006b}, // k {0x006c}, // l {0x006d}, // m {0x006e}, // n {0x006f}, // o {0x0070}, // p {0x0071}, // q {0x0072}, // r {0x0073}, // s {0x0074}, // t {0x0075}, // u {0x0076}, // v {0x0077}, // w {0x0078}, // x {0x0079}, // y {0x007a}, // z {0x007b}, // { {0x007c}, // | {0x007d}, // } {0x007e}, // ~ {0xff61}, // 。 {0xff62}, // 「 {0xff63}, // 」 {0xff64}, // 、 {0xff65}, // ・ {0xff66}, // ヲ {0xff67}, // ァ {0xff68}, // ィ {0xff69}, // ゥ {0xff6a}, // ェ {0xff6b}, // ォ {0xff6c}, // ャ {0xff6d}, // ュ {0xff6e}, // ョ {0xff6f}, // ッ {0xff70}, // ー {0xff71}, // ア {0xff72}, // イ {0xff73}, // ウ {0xff74}, // エ {0xff75}, // オ {0xff76}, // カ {0xff77}, // キ {0xff78}, // ク {0xff79}, // ケ {0xff7a}, // コ {0xff7b}, // サ {0xff7c}, // シ {0xff7d}, // ス {0xff7e}, // セ {0xff7f}, // ソ {0xff80}, // タ {0xff81}, // チ {0xff82}, // ツ {0xff83}, // テ {0xff84}, // ト {0xff85}, // ナ {0xff86}, // ニ {0xff87}, // ヌ {0xff88}, // ネ {0xff89}, // ノ {0xff8a}, // ハ {0xff8b}, // ヒ {0xff8c}, // フ {0xff8d}, // ヘ {0xff8e}, // ホ {0xff8f}, // マ {0xff90}, // ミ {0xff91}, // ム {0xff92}, // メ {0xff93}, // モ {0xff94}, // ヤ {0xff95}, // ユ {0xff96}, // ヨ {0xff97}, // ラ {0xff98}, // リ {0xff99}, // ル {0xff9a}, // レ {0xff9b}, // ロ {0xff9c}, // ワ {0xff9d}, // ン {0xff9e}, // ゙ {0xff9f}, // ゚ {0xff76, 0xff9e}, // ガ {0xff77, 0xff9e}, // ギ {0xff78, 0xff9e}, // グ {0xff79, 0xff9e}, // ゲ {0xff7a, 0xff9e}, // ゴ {0xff7b, 0xff9e}, // ザ {0xff7c, 0xff9e}, // ジ {0xff7d, 0xff9e}, // ズ {0xff7e, 0xff9e}, // ゼ {0xff7f, 0xff9e}, // ゾ {0xff80, 0xff9e}, // ダ {0xff81, 0xff9e}, // ヂ {0xff82, 0xff9e}, // ヅ {0xff83, 0xff9e}, // デ {0xff84, 0xff9e}, // ド {0xff8a, 0xff9e}, // バ {0xff8b, 0xff9e}, // ビ {0xff8c, 0xff9e}, // ブ {0xff8d, 0xff9e}, // ベ {0xff8e, 0xff9e}, // ボ {0xff8a, 0xff9f}, // パ {0xff8b, 0xff9f}, // ピ {0xff8c, 0xff9f}, // プ {0xff8d, 0xff9f}, // ペ {0xff8e, 0xff9f} // ポ }; /** * 全角文字 */ protected static char[] full={ 0x3000, //   0xff01, // ! 0x2033, // ″ 0xff03, // # 0xff04, // $ 0xff05, // % 0xff06, // & 0x2032, // ′ 0xff08, // ( 0xff09, // ) 0xff0a, // * 0xff0b, // + 0xff0c, // , 0xff0d, // − 0xff0e, // . 0xff0f, // / 0xff10, // 0 0xff11, // 1 0xff12, // 2 0xff13, // 3 0xff14, // 4 0xff15, // 5 0xff16, // 6 0xff17, // 7 0xff18, // 8 0xff19, // 9 0xff1a, // : 0xff1b, // ; 0xff1c, // < 0xff1d, // = 0xff1e, // > 0xff1f, // ? 0xff20, // @ 0xff21, // A 0xff22, // B 0xff23, // C 0xff24, // D 0xff25, // E 0xff26, // F 0xff27, // G 0xff28, // H 0xff29, // I 0xff2a, // J 0xff2b, // K 0xff2c, // L 0xff2d, // M 0xff2e, // N 0xff2f, // O 0xff30, // P 0xff31, // Q 0xff32, // R 0xff33, // S 0xff34, // T 0xff35, // U 0xff36, // V 0xff37, // W 0xff38, // X 0xff39, // Y 0xff3a, // Z 0xff3b, // [ 0xffe5, // ¥ 0xff3d, // ] 0xff3e, // ^ 0xff3f, // _ 0xff40, // ` 0xff41, // a 0xff42, // b 0xff43, // c 0xff44, // d 0xff45, // e 0xff46, // f 0xff47, // g 0xff48, // h 0xff49, // i 0xff4a, // j 0xff4b, // k 0xff4c, // l 0xff4d, // m 0xff4e, // n 0xff4f, // o 0xff50, // p 0xff51, // q 0xff52, // r 0xff53, // s 0xff54, // t 0xff55, // u 0xff56, // v 0xff57, // w 0xff58, // x 0xff59, // y 0xff5a, // z 0xff5b, // { 0xff5c, // | 0xff5d, // } // 0xff5e, // 〜 要注意 0xffe3, //  ̄ 0x3002, // 。 0x300c, // 「 0x300d, // 」 0x3001, // 、 0x30fb, // ・ 0x30f2, // ヲ 0x30a1, // ァ 0x30a3, // ィ 0x30a5, // ゥ 0x30a7, // ェ 0x30a9, // ォ 0x30e3, // ャ 0x30e5, // ュ 0x30e7, // ョ 0x30c3, // ッ 0x30fc, // ー 0x30a2, // ア 0x30a4, // イ 0x30a6, // ウ 0x30a8, // エ 0x30aa, // オ 0x30ab, // カ 0x30ad, // キ 0x30af, // ク 0x30b1, // ケ 0x30b3, // コ 0x30b5, // サ 0x30b7, // シ 0x30b9, // ス 0x30bb, // セ 0x30bd, // ソ 0x30bf, // タ 0x30c1, // チ 0x30c4, // ツ 0x30c6, // テ 0x30c8, // ト 0x30ca, // ナ 0x30cb, // ニ 0x30cc, // ヌ 0x30cd, // ネ 0x30ce, // ノ 0x30cf, // ハ 0x30d2, // ヒ 0x30d5, // フ 0x30d8, // ヘ 0x30db, // ホ 0x30de, // マ 0x30df, // ミ 0x30e0, // ム 0x30e1, // メ 0x30e2, // モ 0x30e4, // ヤ 0x30e6, // ユ 0x30e8, // ヨ 0x30e9, // ラ 0x30ea, // リ 0x30eb, // ル 0x30ec, // レ 0x30ed, // ロ 0x30ef, // ワ 0x30f3, // ン 0x309b, // ゛ 0x309c, // ゜ 0x30ac, // ガ 0x30ae, // ギ 0x30b0, // グ 0x30b2, // ゲ 0x30b4, // ゴ 0x30b6, // ザ 0x30b8, // ジ 0x30ba, // ズ 0x30bc, // ゼ 0x30be, // ゾ 0x30c0, // ダ 0x30c2, // ヂ 0x30c5, // ヅ 0x30c7, // デ 0x30c9, // ド 0x30d0, // バ 0x30d3, // ビ 0x30d6, // ブ 0x30d9, // ベ 0x30dc, // ボ 0x30d1, // パ 0x30d4, // ピ 0x30d7, // プ 0x30da, // ペ 0x30dd // ポ }; static { f2h = new Hashtable(300); if (!(_sjis || _windows)){ // UNIXはバックスラッシュ full[55] = 0xff3c ; } for(int i = 0; i < half.length; i++) { f2h.put(new Character(full[i]), half[i]); } } /** * 半角カタカナかどうかチェックします。 * @param c 文字 * @return cが半角カタカナならtrue、それ以外ならfalse */ public static boolean isHalfKana(char c) { return (c > 0xff60 && c <= 0xff9f); } /** * 全角カタカナかどうかチェックします。 * @param c 文字 * @return cが全角カタカナならtrue、それ以外ならfalse */ public static boolean isFullKataKana(char c) { return (c > 0x30a0 && c <= 0x30f4); } /** * 全角ひらがなかどうかチェックします。 * @param c 文字 * @return cが全角ひらがなならtrue、それ以外ならfalse */ public static boolean isFullHiraKana(char c) { return (c > 0x3040 && c <= 0x3094); } /** * 全角かな文字かどうかチェックします。 * @param c 文字 * @return cが全角かな文字ならtrue、それ以外ならfalse */ public static boolean isFullKana(char c) { return isFullKataKana(c) || isFullHiraKana(c) || c==0x3001 || c==0x3002 || c== 0x3094 || (c >= 0x309b && c <=0x309e) || (c >= 0x30f4 && c <=0x30f6) || (c >= 0x30fb && c <=0x30fe); } /** * 半角ASCII文字かどうかチェックします。 * @param c 文字 * @return cが半角ASCII文字ならtrue、それ以外ならfalse */ public static boolean isHalf(char c) { return (c < 0x007f && c >= 0x0020); } /** * 半角文字かどうかチェックします。 * @param c 文字 * @return cが半角文字ならtrue、それ以外ならfalse */ public static boolean isHalf(char c, boolean jp_kana) { return jp_kana ? isHalf(c) || isHalfKana(c) : isHalf(c); } /** * 全角ASCII文字かどうかチェックします。 * @param c 文字 * @return cが全角ASCII文字ならtrue、それ以外ならfalse */ public static boolean isFull(char c) { return (c > 0xff00 && c<= 0xff5e) || c==0x2032 || c==0x2033 || c==0x3000 || c==0x301c; } /** * 全角ひらがなだったら、全角カタカナに変換します。 * @param c 文字 * @return 全角ひらがな以外の文字 */ public static char hiraToKata(char c) { return isFullHiraKana(c) ? (char)(c + 0x60) : c; } /** * 全角カタカナだったら、全角ひらがなに変換します。 * @param c 文字 * @return 全角カタカナ以外の文字 */ public static char kataToHira(char c) { return isFullKataKana(c) ? (char)(c - 0x60) : c; } /** * 半角カタカナだったら、全角カタカナに変換します。 * @param c 文字 * @param iter CharacterIterator * @return 半角カタカナ以外の文字 */ private static char toFull(char c, CharacterIterator iter) { if ( isHalf(c) ) { // これやると、アルファベットも全角に // return full[(int)c - 0x20]; } else if ( isHalfKana(c) ) { char next = iter.next(); if ((next == CharacterIterator.DONE) || !(next == 0xff9e || next == 0xff9f)) { iter.previous(); return full[(int)c - 0xff61 + 0x5f]; } else { for(int i = 158; i < half.length; i++) { if (c == half[i][0] && next == half[i][1]) { return full[i]; } } iter.previous(); return full[(int)c - 0xff61 + 0x5f]; } } return c; } /** * 半角カタカナだったら、全角カタカナに変換します。 * @param s 文字列 * @return 半角カタカナのない文字列 */ public static String toFull(String s) { if (s == null || s.length() <= 0) { return s; } StringCharacterIterator iter = new StringCharacterIterator(s); StringBuffer buf = new StringBuffer(s.length()); for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) { buf.append(toFull(c, iter)); } return buf.toString(); } /** * 全角カタカナだったら、半角カタカナに変換します。 * @param c 文字 * @return 全角カタカナ以外の文字 */ private static char[] toHalf(char c) { // ひらがなもカタカナに変換した後、半角化 // char[] ch = (char[])conv.f2h.get(new Character(hiraToKata(c))); // カタカナだけ半角化 char[] ch = (char[])f2h.get(new Character(c)); // '〜'対策 if ((int)c == 0xff5e) { ch = new char[]{0x007e}; } return ch != null ? ch : new char[]{c}; } /** * 全角カタカナだったら、半角カタカナに変換します。 * @param s 文字列 * @return 全角カタカナ以外の文字 */ public static String toHalf(String s) { if (s == null || s.length() <= 0) { return s; } StringCharacterIterator iter = new StringCharacterIterator(s); StringBuffer buf = new StringBuffer(s.length()); for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) { buf.append(toHalf(c)); } return buf.toString(); } }