JapaneseCharReplacer.java
package com.github.mygreen.supercsv.cellprocessor.conversion;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.github.mygreen.supercsv.util.Utils;
/**
* 日本語の全角・半角の文字を置換する。
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class JapaneseCharReplacer {
private static final Map<CharCategory, String[][]> CHAR_MAPS;
static {
final Map<CharCategory, String[][]> map = new HashMap<>();
map.put(CharCategory.Number, new String[][]{
{"0", "0"},
{"1", "1"},
{"2", "2"},
{"3", "3"},
{"4", "4"},
{"5", "5"},
{"6", "6"},
{"7", "7"},
{"8", "8"},
{"9", "9"},
});
map.put(CharCategory.Alpha, new String[][]{
{"a", "a"},
{"b", "b"},
{"c", "c"},
{"d", "d"},
{"e", "e"},
{"f", "f"},
{"g", "g"},
{"h", "h"},
{"i", "i"},
{"j", "j"},
{"k", "k"},
{"l", "l"},
{"m", "m"},
{"n", "n"},
{"o", "o"},
{"p", "p"},
{"q", "q"},
{"r", "r"},
{"s", "s"},
{"t", "t"},
{"u", "u"},
{"v", "v"},
{"w", "w"},
{"x", "x"},
{"y", "y"},
{"z", "z"},
{"A", "A"},
{"B", "B"},
{"C", "C"},
{"D", "D"},
{"E", "E"},
{"F", "F"},
{"G", "G"},
{"H", "H"},
{"I", "I"},
{"J", "J"},
{"K", "K"},
{"L", "L"},
{"M", "M"},
{"N", "N"},
{"O", "O"},
{"P", "P"},
{"Q", "Q"},
{"R", "R"},
{"S", "S"},
{"T", "T"},
{"U", "U"},
{"V", "V"},
{"W", "W"},
{"X", "X"},
{"Y", "Y"},
{"Z", "Z"},
});
map.put(CharCategory.Space, new String[][]{
{" ", " "},
});
map.put(CharCategory.Symbol, new String[][]{
{"!", "!"},
{"\"", "”"},
{"#", "#"},
{"$", "$"},
{"%", "%"},
{"&", "&"},
{"'", "’"},
{"(", "("},
{")", ")"},
{"=", "="},
{"^", "^"},
{"~", "~"},
{"|", "|"},
{"\\", "¥"},
{"`", "‘"},
{"@", "@"},
{"[", "["},
{"]", "]"},
{"{", "{"},
{"}", "}"},
{"+", "+"},
{"-", "ー"},
{";", ";"},
{":", ":"},
{"*", "*"},
{"<", "<"},
{">", ">"},
{",", ","},
{".", "."},
{"?", "?"},
{"/", "/"},
{"_", "_"},
});
map.put(CharCategory.Katakana, new String[][] {
{"ア", "ア"},
{"イ", "イ"},
{"ウ", "ウ"},
{"エ", "エ"},
{"オ", "オ"},
{"カ", "カ"},
{"キ", "キ"},
{"ク", "ク"},
{"ケ", "ケ"},
{"コ", "コ"},
{"サ", "サ"},
{"シ", "シ"},
{"ス", "ス"},
{"セ", "セ"},
{"ソ", "ソ"},
{"タ", "タ"},
{"チ", "チ"},
{"ツ", "ツ"},
{"テ", "テ"},
{"ト", "ト"},
{"ナ", "ナ"},
{"ニ", "ニ"},
{"ヌ", "ヌ"},
{"ネ", "ネ"},
{"ノ", "ノ"},
{"ハ", "ハ"},
{"ヒ", "ヒ"},
{"フ", "フ"},
{"ヘ", "ヘ"},
{"ホ", "ホ"},
{"マ", "マ"},
{"ミ", "ミ"},
{"ム", "ム"},
{"メ", "メ"},
{"モ", "モ"},
{"ヤ", "ヤ"},
{"ユ", "ユ"},
{"ヨ", "ヨ"},
{"ラ", "ラ"},
{"リ", "リ"},
{"ル", "ル"},
{"レ", "レ"},
{"ロ", "ロ"},
{"ワ", "ワ"},
{"ヲ", "ヲ"},
{"ン", "ン"},
{"ヴ", "ヴ"},
{"パ", "パ"},
{"ピ", "ピ"},
{"プ", "プ"},
{"ペ", "ペ"},
{"ポ", "ポ"},
{"バ", "バ"},
{"ビ", "ビ"},
{"ブ", "ブ"},
{"ベ", "ベ"},
{"ボ", "ボ"},
{"ァ", "ァ"},
{"ィ", "ィ"},
{"ゥ", "ゥ"},
{"ェ", "ェ"},
{"ォ", "ォ"},
{"ッ", "ッ"}
});
CHAR_MAPS = Collections.unmodifiableMap(map);
}
/** 全角文字への置換処理 */
private final CharReplacer fullCharReplacer = new CharReplacer();
/** 半角文字への置換処理 */
private final CharReplacer halfCharReplacer = new CharReplacer();
public JapaneseCharReplacer(final Collection<CharCategory> categories) {
Set<CharCategory> categorySet = new HashSet<>(categories);
for(CharCategory category : categorySet) {
final String[][] charMap = CHAR_MAPS.get(category);
for(String[] map : charMap) {
fullCharReplacer.register(map[0], map[1]);
halfCharReplacer.register(map[1], map[0]);
}
}
fullCharReplacer.ready();
halfCharReplacer.ready();
}
public JapaneseCharReplacer(final CharCategory... categories) {
this(Arrays.asList(categories));
}
/**
* 半角を全角に変換する。
* @param text 変換対象の文字列。
* @return 変換後の値。変換対象の値がnullまたは空文字の場合は、そのまま返します。
*/
public String replaceToFullChar(final String text) {
if(Utils.isEmpty(text)) {
return text;
}
return fullCharReplacer.replace(text);
}
/**
* 全角を半角に変換する。
* @param text 変換対象の文字列。
* @return 変換後の値。変換対象の値がnullまたは空文字の場合は、そのまま返します。
*/
public String replaceToHalfChar(final String text) {
if(Utils.isEmpty(text)) {
return text;
}
return halfCharReplacer.replace(text);
}
}