先分享一個(gè)unicode一覽的網(wǎng)址:鏈接
在里面可以找到各個(gè)字符對應(yīng)的unicode對應(yīng)的十六進(jìn)制數(shù)
1、 全角半角檢測
根據(jù)上面的網(wǎng)站称近,使用正則表達(dá)式檢測對應(yīng)的unicode就可以
// 全角
fun String.isFullChar(): Boolean {
return matches(Regex("^[\\u3040-\\u30FF]+$"))
}
// 半角第队,注意平假名沒有半角
fun String.isHalfChar(): Boolean {
return matches(Regex("^[\\uFF60-\\uFF9F]+$"))
}
2、 英文和數(shù)字的轉(zhuǎn)換
在上面的網(wǎng)址中刨秆,可以發(fā)現(xiàn)英文和數(shù)字的半角和全角的unicode差值是固定的凳谦。所以可以通過簡單的加減來轉(zhuǎn)換。
//初始的字符串
val org = ""
//半角轉(zhuǎn)全角
org = org.replace(Regex("[\\u0020-\\u007E]")) {
(it.value[0] + 0xFEE0).toString()
}
……
//全角轉(zhuǎn)半角
org = org.replace(Regex("[\\uFF00-\\uFF5E]")) {
(it.value[0] - 0xFEE0).toString()
}
3衡未、 假名的轉(zhuǎn)換
假名的轉(zhuǎn)換要復(fù)雜的多尸执,因?yàn)榧倜娜前虢遣钪挡还潭ǎ⑶一捍祝瑵嵋舭霛嵋舻陌虢鞘莾蓚€(gè)字符如失,全角是一個(gè)字符,轉(zhuǎn)換起來會(huì)很麻煩送粱。
參考鏈接
val kanaHanZenTbl = arrayOf(
// 濁音和半濁音褪贵,必須要放在前面,因?yàn)??要轉(zhuǎn)換的話抗俄,是ガ不是一個(gè)カ加上"
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(" ", " ")
)
轉(zhuǎn)換的整體思路是动雹,將所有的假名放在二維數(shù)組中槽卫,然后一個(gè)一個(gè)對比,進(jìn)行轉(zhuǎn)換胰蝠。
//擴(kuò)展方法
fun String.halfToFullChar(): String {
if (!hasHalfChar()) {
return this
}
var org = this
kanaHanZenTbl.forEach {
org = org.replace(it[0], it[1])
}
//英文數(shù)字
org = org.replace(Regex("[\\u0020-\\u007E]")) {
(it.value[0] + 0xFEE0).toString()
}
return org
}
這里沒有寫全角轉(zhuǎn)半角的方法歼培,因?yàn)槠郊倜麤]有半角震蒋,所以轉(zhuǎn)換起來可能有問題,不過應(yīng)該可以根據(jù)上面的方法寫出來一個(gè)丐怯。這里就不再寫了。