(JAVA)截取中英文混合字符串

題目:

編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。 但是要保證漢字不被截半個,如“我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】

發佈了21 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章