【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
}

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 传送门:排序算法演示小DEMO 前面的话 为了给字符串数组排序,除了用C/C++的基本办法,iOS开发者更应该学会...
    小码僧阅读 4,308评论 5 62
  • 一、是什么? 「全角」和「半角」是指计算机中CJK 字符的显示格式。(读完全文就可知,这是个不算太严谨但可以稍加补...
    有且仅有la阅读 2,978评论 0 1
  • 1、js 日语全半角转换 客户的需求是,输入半角字符或日语假名,筛选出来的结果显示包含该字符的半角形式和全角形式的...
    看看你的肥脸阅读 1,595评论 0 0
  • 对一部叙述大唐由盛转衰三十年间的一部片子,本是充满期待,加入了妖猫的题材,对情爱,人性,幻术等令整部电影有了更多的...
    白色石南阅读 192评论 0 1
  • 项目里经常会遇到字典或者字典包含数组,也许是更复杂的数据结构,一层层剥离,其实也可以,但是借助 MJExtensi...
    雪_晟阅读 789评论 0 1