【kotlin】日文假名的全半角转换

先分享一个unicode一览的网址:链接
在里面可以找到各个字符对应的unicode对应的十六进制数

1、 全角半角检测

根据上面的网站,使用正则表达式检测对应的unicode就可以

// 全角
fun String.isFullChar(): Boolean {
    return matches(Regex("^[\\u3040-\\u30FF]+$"))
}

// 半角,注意平假名没有半角
fun String.isHalfChar(): Boolean {
    return matches(Regex("^[\\uFF60-\\uFF9F]+$"))
}

2、 英文和数字的转换

在上面的网址中,可以发现英文和数字的半角和全角的unicode差值是固定的。所以可以通过简单的加减来转换。

//初始的字符串
val org = "" 
//半角转全角
org = org.replace(Regex("[\\u0020-\\u007E]")) {
        (it.value[0] + 0xFEE0).toString()
    }
……
//全角转半角
org = org.replace(Regex("[\\uFF00-\\uFF5E]")) {
        (it.value[0] - 0xFEE0).toString()
    }

3、 假名的转换

假名的转换要复杂的多,因为假名的全角半角差值不固定,并且,浊音半浊音的半角是两个字符,全角是一个字符,转换起来会很麻烦。
参考链接

val kanaHanZenTbl = arrayOf(
        // 浊音和半浊音,必须要放在前面,因为ガ要转换的话,是ガ不是一个カ加上"
        arrayOf("ガ", "ガ"), arrayOf("ギ", "ギ"), arrayOf("グ", "グ"), arrayOf("ゲ", "ゲ"), arrayOf("ゴ", "ゴ"),
        arrayOf("ザ", "ザ"), arrayOf("ジ", "ジ"), arrayOf("ズ", "ズ"), arrayOf("ゼ", "ゼ"), arrayOf("ゾ", "ゾ"),
        arrayOf("ダ", "ダ"), arrayOf("ヂ", "ヂ"), arrayOf("ヅ", "ヅ"), arrayOf("デ", "デ"), arrayOf("ド", "ド"),
        arrayOf("バ", "バ"), arrayOf("ビ", "ビ"), arrayOf("ブ", "ブ"), arrayOf("ベ", "ベ"), arrayOf("ボ", "ボ"),
        arrayOf("パ", "パ"), arrayOf("ピ", "ピ"), arrayOf("プ", "プ"), arrayOf("ペ", "ペ"), arrayOf("ポ", "ポ"),
        arrayOf("ヴ", "ヴ"),
        // 单字符的假名
        arrayOf("ア", "ア"), arrayOf("イ", "イ"), arrayOf("ウ", "ウ"), arrayOf("エ", "エ"), arrayOf("オ", "オ"),
        arrayOf("カ", "カ"), arrayOf("キ", "キ"), arrayOf("ク", "ク"), arrayOf("ケ", "ケ"), arrayOf("コ", "コ"),
        arrayOf("サ", "サ"), arrayOf("シ", "シ"), arrayOf("ス", "ス"), arrayOf("セ", "セ"), arrayOf("ソ", "ソ"),
        arrayOf("タ", "タ"), arrayOf("チ", "チ"), arrayOf("ツ", "ツ"), arrayOf("テ", "テ"), arrayOf("ト", "ト"),
        arrayOf("ナ", "ナ"), arrayOf("ニ", "ニ"), arrayOf("ヌ", "ヌ"), arrayOf("ネ", "ネ"), arrayOf("ノ", "ノ"),
        arrayOf("ハ", "ハ"), arrayOf("ヒ", "ヒ"), arrayOf("フ", "フ"), arrayOf("ヘ", "ヘ"), arrayOf("ホ", "ホ"),
        arrayOf("マ", "マ"), arrayOf("ミ", "ミ"), arrayOf("ム", "ム"), arrayOf("メ", "メ"), arrayOf("モ", "モ"),
        arrayOf("ヤ", "ヤ"), arrayOf("ユ", "ユ"), arrayOf("ヨ", "ヨ"), arrayOf("ラ", "ラ"), arrayOf("リ", "リ"),
        arrayOf("ル", "ル"), arrayOf("レ", "レ"), arrayOf("ロ", "ロ"), arrayOf("ワ", "ワ"), arrayOf("ヲ", "ヲ"),
        arrayOf("ン", "ン"), arrayOf("ァ", "ァ"), arrayOf("ィ", "ィ"), arrayOf("ゥ", "ゥ"), arrayOf("ェ", "ェ"),
        arrayOf("ォ", "ォ"), arrayOf("ャ", "ャ"), arrayOf("ュ", "ュ"), arrayOf("ョ", "ョ"), arrayOf("ッ", "ッ"),
        arrayOf("。", "。"), arrayOf("「", "「"), arrayOf("」", "」"), arrayOf("、", "、"), arrayOf("・", "・"),
        arrayOf("ー", "ー"), arrayOf("", ""), arrayOf("\t", " "), arrayOf("\n", " "), arrayOf(" ", " ")
)

转换的整体思路是,将所有的假名放在二维数组中,然后一个一个对比,进行转换。

//扩展方法
fun String.halfToFullChar(): String {
    if (!hasHalfChar()) {
        return this
    }
    var org = this
    kanaHanZenTbl.forEach {
        org = org.replace(it[0], it[1])
    }
    //英文数字
    org = org.replace(Regex("[\\u0020-\\u007E]")) {
        (it.value[0] + 0xFEE0).toString()
    }
    return org
}

这里没有写全角转半角的方法,因为平假名没有半角,所以转换起来可能有问题,不过应该可以根据上面的方法写出来一个。这里就不再写了。

你可能感兴趣的:(【kotlin】日文假名的全半角转换)