編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
GB2312、GBK、GB18030,CP936以及CNS11643都滿足條件 -- 中文是占用2個字節的,英文是占用1一個字節 。因為中文轉換為byte字節,隨着編碼的不同,轉換的字節長度也會不通,如編碼為UTF-8,一個中文字符串轉換為byte占三個字節.
package com.suanfa;
import java.io.UnsupportedEncodingException;
public class CharactersSplit {
/**
* @param text 目標字符串
* @param length 截取長度
* @param encode 采用的編碼方式
* @return
* @throws UnsupportedEncodingException
*/
public static String substring(String text, int length, String encode)
throws UnsupportedEncodingException {
if (text == null) {
return null;
}
StringBuilder sb = new StringBuilder();
int currentLength = 0;
for (char c : text.toCharArray()) {
currentLength += String.valueOf(c).getBytes(encode).length;
if (currentLength <= length) {
sb.append(c);
} else {
break;
}
}
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
String text = "我ABC漢DEF";
int length1 = 3;
int length2 = 6;
String[] encodes = new String[] { "GB2312", "GBK", "GB18030", "CP936",
"CNS11643", "UTF-8" };
for (String encode : encodes) {
System.out.println(new StringBuilder().append("用").append(encode)
.append("編碼截取字符串 -- 【").append(text).append("】")
.append(length1).append("個字節的結果是【")
.append(substring(text, length1, encode)).append("】")
.toString());
System.out.println(new StringBuilder().append("用").append(encode)
.append("編碼截取字符串 -- 【").append(text).append("】")
.append(length2).append("個字節的結果是【")
.append(substring(text, length2, encode)).append("】")
.toString());
}
}
}
運行后輸出:
用GB2312編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我A】
用GB2312編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】
用GBK編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我A】
用GBK編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】
用GB18030編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我A】
用GB18030編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】
用CP936編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我A】
用CP936編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】
用CNS11643編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我A】
用CNS11643編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】
用UTF-8編碼截取字符串 -- 【我ABC漢DEF】3個字節的結果是【我】
用UTF-8編碼截取字符串 -- 【我ABC漢DEF】6個字節的結果是【我ABC】