Java 截取中英文混合字符串

編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。 可是要保證漢字不被截半個,如「我ABC」4,應該截爲「我AB」,輸入「我ABC漢DEF」,6,應該輸出爲「我ABC」而不是「我ABC+漢的半個」。
GB23十二、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】java

相關文章
相關標籤/搜索