Web應(yīng)用程序在瀏覽器中顯示字符串時,由于顯示長度的限制,常常需要將字符串截取后再進(jìn)行顯示。但目前很多流行的語言,如C#、Java內(nèi)部采用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字符都是兩個字符,因此,如果要截取的字符串是中、英文、數(shù)字混合的,就會產(chǎn)生問題,如下面的字符串:
- String s = "a加b等于c,如果a等1、b等于2,那么c等3";
上面的字符串既有漢字,又有英文字符和數(shù)字。如果要截取前6個字節(jié)的字符,應(yīng)該是”a加b等",但如果用substring方法截取前6個字符就成了"a 加b等于c"。產(chǎn)生這個問題的原因是將substring方法將雙字節(jié)的漢字當(dāng)成一個字節(jié)的字符(UCS2字符)處理了。要解決這個問題的方法是首先得到該字符串的UCS2編碼的字節(jié)數(shù)組,如下面的代碼如下:
- byte[] bytes = s.getBytes("Unicode");
由于上面生成的字節(jié)數(shù)組中前兩個字節(jié)是標(biāo)志位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個字節(jié)開始掃描,對于一個英文或數(shù)字字符,UCS2編碼的第二個字節(jié)是相應(yīng)的ASCII,第一個字節(jié)是0,如a的UCS2編碼是0 97,而漢字兩個字節(jié)都不為0,因此,可以利于UCS2編碼的這個規(guī)則來計算實際的字節(jié)數(shù),該方法的實現(xiàn)代碼如下:
下面代碼使用了bSubstring方法: 上面的代碼截取的字符串是"a加b等"。