問題:
???
字符串:music<<美麗的草原我的家>>。該字符串的長度即str.length()為:17,而目前需要存入數(shù)據(jù)庫對應(yīng)的
字段長度為:16。所以必須對字符串進(jìn)行截取。而前16個(gè)字節(jié)中,“原”字只有半個(gè)。這樣存入數(shù)據(jù)庫確對會(huì)出現(xiàn)“?”。所以必須判斷是否是半個(gè)漢字,即只
能存入“music<<美麗的草”。
分析:
??? 漢字是雙字節(jié)編碼,它為了能夠與英文字符分開,每個(gè)字節(jié)的最高位一定為1。如果是漢字,那么這個(gè)字節(jié)就是小于0的。這個(gè)函數(shù)就是通過這一原理實(shí)現(xiàn)的。所以要通過getBytes()轉(zhuǎn)化為byte型,再比較與零的大小。 ?
getBytes()是把一個(gè)字符串轉(zhuǎn)成一個(gè)byte數(shù)組,因?yàn)橛?jì)算機(jī)的數(shù)據(jù)都是基于字符的,也就是說一個(gè)字符串實(shí)際上就是一個(gè)字符流,因此可以轉(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); ?
? ?}??