題目:
編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,應該截爲“我AB”,輸入“我ABC漢DEF”,6,應該輸出爲“我ABC”而不是“我ABC+漢的半個”。
GB2312、GBK、GB18030,CP936以及CNS11643都滿足條件 -- 中文是佔用2個字節的,英文是佔用1一個字節 。
中文編碼資料:
中文字符編碼簡介
http://www.cftea.com/c/2008/03/140B5A561NFN51DS.asp
中文編碼基礎知識介紹
http://www.eygle.com/digest/2007/01/zhs16gbk_char.html
JAVA 編碼
import java.io.UnsupportedEncodingException;
/**
* 題目: 編寫一個截取字符串的函數,輸入爲一個字符串和字節數, 輸出爲按字節截取的字符串。 但是要保證漢字不被截半個,如“我ABC”4,
* 應該截爲“我AB”,輸入“我ABC漢DEF”,6, 應該輸出爲“我ABC”而不是“我ABC+漢的半個”。
*
* 解決方法: 中文是佔用2個字節的,英文是佔用1一個字節, 所以先確定一種編碼滿足此條件。
* GB2312、GBK、GB18030,CP936以及CNS11643都滿足條件。
*
* @author Eric
* @version 1.0
*
*/
public class CharactersSplit {
/**
*
* @param text 目標字符串
* @param length 截取長度
* @param encode 採用的編碼方式
* @return
* @throws UnsupportedEncodingException
*/
public 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 void test() throws Exception {
String text = "我ABC漢DEF";
int length1 = 3;
int length2 = 6;
String[] encodes = new String[] { "GB2312", "GBK", "GB18030", "CP936",
"CNS11643" };
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());
}
}
public static void main(String[] args) throws Exception {
new CharactersSplit().test();
}
}
測試結果:
用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】