問題:
字符串:music<<美麗的草原我的家>>。該字符串的長度即str.length()為:17,而目前需要存入數(shù)據(jù)庫對應(yīng)的字段長度為:16。所以必須對字符串進行截取。而前16個字節(jié)中,“原”字只有半個。這樣存入數(shù)據(jù)庫確對會出現(xiàn)“?”。所以必須判斷是否是半個漢字,即只能存入“music<<美麗的草”。
分析:
漢字是雙字節(jié)編碼,它為了能夠與英文字符分開,每個字節(jié)的最高位一定為1。如果是漢字,那么這個字節(jié)就是小于0的。這個函數(shù)就是通過這一原理實現(xiàn)的。所以要通過getBytes()轉(zhuǎn)化為byte型,再比較與零的大小。
getBytes()是把一個字符串轉(zhuǎn)成一個byte數(shù)組,因為計算機的數(shù)據(jù)都是基于字符的,也就是說一個字符串實際上就是一個字符流,因此可以轉(zhuǎn)為字符數(shù)組。
程序:
public static String getStr(String src, int len) {
if (src == null) return null;
if (src.getBytes().length <= len) return src;
byte[] s = src.getBytes();
int flag = 0;
for(int i=0;i<len;++i){
if(s[i] < 0) flag++;
}
if(flag%2!=0) len--;
byte[] d = new byte[len];
System.arraycopy(s, 0, d, 0, len);
return new String(d);
}
字符串:music<<美麗的草原我的家>>。該字符串的長度即str.length()為:17,而目前需要存入數(shù)據(jù)庫對應(yīng)的字段長度為:16。所以必須對字符串進行截取。而前16個字節(jié)中,“原”字只有半個。這樣存入數(shù)據(jù)庫確對會出現(xiàn)“?”。所以必須判斷是否是半個漢字,即只能存入“music<<美麗的草”。
分析:
漢字是雙字節(jié)編碼,它為了能夠與英文字符分開,每個字節(jié)的最高位一定為1。如果是漢字,那么這個字節(jié)就是小于0的。這個函數(shù)就是通過這一原理實現(xiàn)的。所以要通過getBytes()轉(zhuǎn)化為byte型,再比較與零的大小。
getBytes()是把一個字符串轉(zhuǎn)成一個byte數(shù)組,因為計算機的數(shù)據(jù)都是基于字符的,也就是說一個字符串實際上就是一個字符流,因此可以轉(zhuǎn)為字符數(shù)組。
程序:
public static String getStr(String src, int len) {
if (src == null) return null;
if (src.getBytes().length <= len) return src;
byte[] s = src.getBytes();
int flag = 0;
for(int i=0;i<len;++i){
if(s[i] < 0) flag++;
}
if(flag%2!=0) len--;
byte[] d = new byte[len];
System.arraycopy(s, 0, d, 0, len);
return new String(d);
}