Android分割字符串,中文/日文/韩文按2个字节,其他语言按1个字节计算
分割字符串用于打印或者自动换行时,要求按一定字数分割,CJK字符(中、日、韩文字)按2个字数计算,英文等其他语言的字符按1个字数计算。有其他需求也可参考该实现方式。
/**
* 将字符串按要求的字符分割
* @param sourceString 要分割的字符串
* @param splitNum 分割单位长度,CJK字符占2位,其他文字占1位
* @return 分割完成的字符串
*/
private fun slitString(sourceString: String, splitNum: Int): List<String> {
val resultList: MutableList<String> = arrayListOf()
var textString = sourceString
while (textString.isNotEmpty()) {
// 获取截取长度
var currentLength: Int = 0//当前已截取的字符串长度
for (i in textString.indices) {
val charLength = if (isCJK(textString[i])) 2 else 1//中日韩文字算作2字节
if (currentLength + charLength > splitNum) {
resultList.add(textString.substring(0, i))
// 重置未加入的字符串
textString = textString.substring(i, textString.length)
break
} else {
if (i == textString.length - 1) {
//已经到最后一位
resultList.add(textString)
textString = ""
break
}
//还未达到一行需要截取的长度
currentLength += charLength
}
}
}
return resultList
}
/**
* 判断字符是否为中、日、韩文
*/
private fun isCJK(ch: Char): Boolean {
val unicodeBlock = Character.UnicodeBlock.of(ch)
return when {
unicodeBlock == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| unicodeBlock == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| unicodeBlock == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| unicodeBlock == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| unicodeBlock == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| unicodeBlock == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
-> true
// 对于中日韩特有的Unicode区块,可以继续添加判断
else -> false
}
}
1902

被折叠的 条评论
为什么被折叠?



