麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

Java中如而后按字節截取字符串

2023-06-10 12:43:26
字體:
來源:轉載
供稿:網友

有時我們需要按字節數來截取一個字符串,即輸入為一個字符串和字節數,輸出為按字節截取的字符串。但是要保證漢字不被截半個,如"我ABC"4,應該截為"我AB",輸入"我ABC漢DEF",6,應該輸出為"我ABC"而不是"我ABC+漢的半個",相關源代碼如下所示:

  public static String substring(String str, int toCount,String more)

  {

  int reInt = 0;

  String reStr = "";

  if (str == null)

  return "";

  char[] tempChar = str.toCharArray();

  for (int kk = 0; (kk < tempChar.length && toCount > reInt); kk++) {

  String s1 = str.valueOf(tempChar[kk]);

  byte[] b = s1.getBytes();

  reInt += b.length;

  reStr += tempChar[kk];

  }

  if (toCount == reInt || (toCount == reInt - 1))

  reStr += more;

  return reStr;

  }

Web應用程序在瀏覽器中顯示字符串時,由于顯示長度的限制,常常需要將字符串截取后再進行顯示。但目前很多流行的語言,如C#、Java內部采用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字符都是兩個字符,因此,如果要截取的字符串是中、英文、數字混合的,就會產生問題,如下面的字符串:

String s = "a加b等于c,如果a等1、b等于2,那么c等3";

上面的字符串既有漢字,又有英文字符和數字。如果要截取前6個字節的字符,應該是”a加b等",但如果用substring方法截取前6個字符就成了"a 加b等于c"。產生這個問題的原因是將substring方法將雙字節的漢字當成一個字節的字符(UCS2字符)處理了。要解決這個問題的方法是首先得到該字符串的UCS2編碼的字節數組,如下面的代碼如下:

byte[] bytes = s.getBytes("Unicode");

由于上面生成的字節數組中前兩個字節是標志位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個字節開始掃描,對于一個英文或數字字符,UCS2編碼的第二個字節是相應的ASCII,第一個字節是0,如a的UCS2編碼是0  97,而漢字兩個字節都不為0,因此,可以利于UCS2編碼的這個規則來計算實際的字節數,該方法的實現代碼如下:

public static String bSubstring(String s, int length) throws Exception

  {

  byte[] bytes = s.getBytes("Unicode");

  int n = 0; // 表示當前的字節數

  int i = 2; // 要截取的字節數,從第3個字節開始

  for (; i < bytes.length && n < length; i++)

  {

  // 奇數位置,如3、5、7等,為UCS2編碼中兩個字節的第二個字節

  if (i % 2 == 1)

  {

  n++; // 在UCS2第二個字節時n加1

  }

  else

  {

  // 當UCS2編碼的第一個字節不等于0時,該UCS2字符為漢字,一個漢字算兩個字節

  if (bytes[i] != 0)

  {

  n++;

  }

  }

  }

  // 如果i為奇數時,處理成偶數

  if (i % 2 == 1)

  {

  // 該UCS2字符是漢字時,去掉這個截一半的漢字

  if (bytes[i - 1] != 0)

  i = i - 1;

  // 該UCS2字符是字母或數字,則保留該字符

  else

  i = i + 1;

  }

  return new String(bytes, 0, i, "Unicode");

  }

  下面代碼使用了bSubstring方法:

  String s = "a加b等于c,如果a等1、b等于2,那么c等3";

  System.out.println(bSubstring(s, 6));

  上面的代碼截取的字符串是"a加b等"。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品久久久久久久久久中出 | 黄污污网站 | 精品亚洲福利一区二区 | 久久亚洲一区二区三区成人国产 | 久久丝袜脚交足黄网站免费 | 一级性生活免费视频 | 成人三级电影网站 | 成人午夜天堂 | 久久精品二区 | 欧美aaaaa一级毛片在线 | 欧美极品免费 | 久久久精品99 | 国产亚洲精品久久久久久网站 | a级在线 | 欧美视频99 | 羞羞电影网 | 高清国产午夜精品久久久久久 | 国产毛片aaa一区二区三区视频 | 欧美精品成人一区二区三区四区 | 国产91精品亚洲精品日韩已满 | 高清成人在线 | 麻豆视频在线免费观看 | 午夜视频导航 | 免费a观看 | 黄色成人短视频 | 国产精品一区二区三区在线播放 | 久久色播| 海角在线观看91一区二区 | 久久草草影视免费网 | 欧美成人激情在线 | 国产毛片网站 | 福利在线播放 | 国产毛片网 | 久久国产精品二国产精品中国洋人 | 一级毛片电影网 | 91精品观看91久久久久久国产 | 成年人福利视频 | 久久精品视频国产 | 在线视频观看国产 | 国产剧情在线观看一区二区 | 久久精品99久久久久久2456 |