標籤:c99 bsp param tac tostring esc 統計 split sys
java 字串截取(當遇到截取半個漢字的處理)方法2捨去(項目中用的)
方法1是看的別人的,個人認為方法1簡潔
package everyDay;
import java.io.UnsupportedEncodingException;
/**
* * 題目:
編寫一個截取字串的函數,輸入為一個字串和位元組數,輸出為按位元組截取的字串。 但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
GB2312、GBK、GB18030,CP936以及CNS11643都滿足條件 -- 中文是佔用2個位元組的,英文是佔用1一個位元組 。
因為中文轉換為byte位元組,隨著編碼的不同,轉換的位元組長度也會不通,如編碼為UTF-8,一個中文字串轉換為byte佔三個位元組.
*
*/
public class LearnCSplit {
/**
* 方法1,比方法2簡潔
* @param text
* 目標字串
* @param length
* 截取長度
* @param encode
* 採用的編碼方式
* @return
* @throws UnsupportedEncodingException
*/
private static String substring(String str, int length1, String code) throws UnsupportedEncodingException {
if (str==null) {
return null;
}
StringBuilder sb=new StringBuilder();
int currentLength=0;
for (char c : str.toCharArray()) {
currentLength+=String.valueOf(c).getBytes(code).length;
if (currentLength<=length1) {
sb.append(c);
}else {
break;
}
}
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
//StringBuilder sb=null;//線程不安全,效能高
String str="我ABC漢DEF";
int length1=3;
int length2=6;
String [] codes=new String[]{"GB2312","GBK","GB18030","CP936","CNS11643","UTF-8"};
for (String code : codes) {
System.out.println(new StringBuilder().append("用").append(code)
.append("編碼截取字串--【“").append(str).append("】")
.append(length1).append("個位元組的結果是【")
.append(substring(str,length1,code)).append("】").toString());
System.out.println(new StringBuilder().append("用").append(code)
.append("編碼截取字串--【“").append(str).append("】")
.append(length2).append("個位元組的結果是【")
.append(substring(str,length2,code)).append("】").toString());
}
////以上是方法1的
String value="烏魯木齊測試測試開發資源服務有限責任公司達阪城分公司1A2b3";
//統計位元組數
int countBytes=conutByte(value);
//已知欄位長度40個位元組
if (countBytes>40) {
value=substr(value,0,40);
System.out.println("輸出指定欄位長度的字串:"+value);
}
}
/**
* 統計位元組數
* @param value
* @return
*/
private static int conutByte(String value) {
if (value==null) {
return 0;
}
byte[] bs;
try {
bs = value.getBytes("GB18030");
int lenbs=bs.length;
return lenbs;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* 截取字元
* @param str
* @param begin
* @param zdcd
* @return
*/
private static String substr(String str, int begin, int zdcd) {
if (str == null) {
return str;
}
String str2;
str=getSubString(str,zdcd);//截取指定位元組長度的字串,不能返回半個漢字20
zdcd=conutByte(str);//再從新計算位元組個數,19
//我去惡趣味123我我去
byte[] bs;
try {
bs = str.getBytes("GB18030");
str2 = new String(bs, begin, zdcd, "GB18030");
return str2;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
/**
* <b>截取指定位元組長度的字串,不能返回半個漢字</b>
* @param str
* @param zdcd
* @return
*/
private static String getSubString(String str, int zdcd) {
int count=0;
int offset=0;
char[] c=str.toCharArray();
for (int i = 0; i < c.length; i++) {
if (c[i]>256) {
offset=2;
count+=2;
}else{
offset=1;
count++;
}
if (count==zdcd) {
return str.substring(0, i+1);
}
if ((count==zdcd+1 && offset==2)) {
return str.substring(0, i);
}
}
return "";
}
}
控制台輸出結果:
用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】
輸出指定欄位長度的字串:烏魯木齊測試測試開發資源服務有限責任公司
方法3:截取指定長度的字串
public class CharactersSplit {
public static void main(String[] args) {
String value="烏魯a木齊 同盛人力資源服務有限責任公司達阪城分公司1A2b3";//24+6+2=32
//value=getSubString(value,value.toCharArray().length);//烏魯a木齊 同
value=getSubString(value,89);
//value=value.substring(0, 6);//烏魯a木齊 同//這如果是89就會報下標越界
System.out.println(value);
}
/**
*Description:截取指定長度的字串
* 與字串 substring 方法相比,可以規長度不夠截取出現的下標越界等問題
*/
public static String getSubString(String sOurce, int len) {
if (sOurce.isEmpty()) {
return "";
}
if (sOurce.length() <= len) {//32=32
// sOurce.length()=value.toCharArray().length
return sOurce;
}
return sOurce.substring(0, len);
}
}
運行輸出結果:烏魯a木齊 同盛人力資源服務有限責任公司達阪城分公司1A2b3
java 字串截取