001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    /**
019     * KanaFilter.java は、半角カタカナを全角カタカナに変換するフィルター??ルです?
020     *
021     * 大??出典は、?CJKV日中韓越情報処??のフィルターアルゴリズ?す?
022     * 濁点?濁点の正しい処?含まれて?す?
023     *
024     * @version  4.0
025     * @author   Kazuhiko Hasegawa
026     * @since    JDK5.0,
027     */
028    public final class KanaFilter {
029    
030            /**
031             * すべて?staticメソ?なので、コンストラクタを呼び出さなくしておきます?
032             *
033             */
034            private KanaFilter() {}
035    
036            // uFF61 から uFF9Fまでの半角カナに対?u3002 ??u309C)
037            private static final char ZEN_KANA[] = {
038                    '?,'?,'?,'?,'・',
039                    'ヲ','ァ','ィ','ゥ','ェ','ォ',
040                    'ャ','ュ','ョ','?,'ー',
041                    'ア','イ','ウ','エ','オ',
042                    'カ','キ','ク','ケ','コ',
043                    'サ','シ','ス','セ','ソ',
044                    'タ','?,'?,'?,'?,
045                    '?,'?,'?,'?,'?,
046                    '?,'?,'?,'?,'?,
047                    '?,'?,'?,'メ','モ',
048                    'ヤ','ユ','ヨ',
049                    'ラ','リ','ル','レ','ロ',
050                    'ワ','ン','?,'?
051            };
052    
053            /**
054             * 半角カタカナを全角カタカナに
055             *
056             * 半角カタカナ?定義は、\uFF61 から \uFF9F までです?
057             *
058             * @param   in 半角カタカナ文字?
059             *
060             * @return  全角文字?
061             */
062            public static String han2zen( final String in ) {
063                    int ixIn  = 0;
064                    int ixOut = 0;
065                    int len = in.length();
066                    char[] input = in.toCharArray();
067                    char[] output = new char[len + 1];
068    
069                    while( ixIn < len ) {
070                            // 半角カタカナ??
071                            if( input[ixIn] >= '\uFF61' && input[ixIn] <= '\uFF9F' ) {
072                                    if( ixIn + 1 >= len ) {
073                                            output[ixOut++] = ZEN_KANA[input[ixIn++] - '\uFF61'];
074                                    }
075                                    else {
076                                            // 濁点(ヴ)
077                                            if( input[ixIn+1] == '?? ||
078                                                            input[ixIn+1] == '\u3099' ||
079                                                            input[ixIn+1] == '? ) {
080                                                    if( input[ixIn] == '?' ) {
081                                                            output[ixOut++] = 'ヴ' ;
082                                                            ixIn +=2 ;
083                                                    }
084                                                    else {
085                                                            // 濁点(ガ?ド、バ??)
086                                                            if( input[ixIn] >= '?' &&
087                                                                            input[ixIn] <= '?? ||
088                                                                            input[ixIn] >= '?? &&
089                                                                            input[ixIn] <= '?? ) {
090                                                                    output[ixOut] = ZEN_KANA[input[ixIn] - '\uFF61'];
091                                                                    output[ixOut++]++;
092                                                                    ixIn +=2 ;
093                                                            }
094                                                            else {
095                                                                    output[ixOut++] = ZEN_KANA[input[ixIn++] - '\uFF61'];
096                                                            }
097                                                    }
098                                            }
099                                            else {
100                                                    // 半濁点(パ~?)
101                                                    if( input[ixIn+1] == '?? ||
102                                                                    input[ixIn+1] == '\u309A' ||
103                                                                    input[ixIn+1] == '? ) {
104                                                            if( input[ixIn] >= '?? &&
105                                                                            input[ixIn] <= '?? ) {
106                                                                    output[ixOut] = ZEN_KANA[input[ixIn] - '\uFF61'];
107                                                                    output[ixOut++]+=2;
108                                                                    ixIn +=2 ;
109                                                            }
110                                                            else {
111                                                                    output[ixOut++] = ZEN_KANA[input[ixIn++] - '\uFF61'];
112                                                            }
113                                                    }
114                                                    else {
115                                                            output[ixOut++] = ZEN_KANA[input[ixIn++] - '\uFF61'];
116                                                    }
117                                            }
118                                    }
119                            }
120                            else {
121                                    output[ixOut++] = input[ixIn++];
122                            }
123                    }
124                    String output_string = new String( output );
125                    return output_string.substring(0,ixOut);
126            }
127    
128            /**
129             * ?ト用 mainメソ?
130             *
131             * @param       args    変換?字?
132             */
133            public static void main( final String[] args ) {
134                    System.out.println( KanaFilter.han2zen( args[0] ) );
135            }
136    
137    }