天天看點

短信發送接收時的UCS2編碼轉換處理

其實UCS2這種編碼不像GB2312、UTF-8等,它并不屬于任何語系的語言編碼,實際上是一種編碼格式的世界語。在這個世界上所有可以在計算機中使用的語言都有對應的UCS2編碼。

正是因為Java采用了UCS2,是以,在Java中可以使用世界上任何國家的語言來為變量名、方法名、類起名,如下面代碼如下:

public class 中國
{
    public String 雄起()
    {
         return "中國雄起";
    }
}
中國 祖國 = new 中國();
System.out.println(祖國.雄起());      

實際上,也可以使用其他的語言來程式設計,如下面用韓文和日文來定義個類:

class 수퍼맨
{
    public void スーパーマン() { ... }
}      
由于Java内部使用的是UCS2編碼格式,因為,Java并不關心所使用的是哪種語言,而隻要這種語言在UCS2中有定義就可以。
在UCS2編碼中為不同國家的語言進行了分頁,這個分頁也叫“代碼頁”或“編碼頁”。中文根據包含中文字元的多少,分了很多代碼頁,如cp935、cp936等,然而,這些都是在UCS2中的代碼頁名,而對于作業系統來說,如微軟的windows,一開始的中文編碼為GB2312,後來擴充成了GBK。其實GBK和cp936是完全等效的,用它們哪個都行。       

=華麗麗的分隔符===

上面都是廢話了,這裡關鍵想說的是,怎麼從UCS2轉為GBK?以及怎麼從GBK轉為UCS2?

網上有人提供了個方法:

public static String decodeUCS2(String src) {
  byte[] bytes = new byte[src.length() / 2];

  for (int i = 0; i < src.length(); i += 2) {
   bytes[i / 2] = (byte) (Integer.parseInt(src.substring(i, i + 2), 16));
  }
  String reValue;
  try {
   reValue = new String(bytes, "UTF-16BE");
  } catch (UnsupportedEncodingException e) {
   throw new RuntimeException(e);
  }
  return reValue;
 }      
String reValue = new String(bytes, "UTF-16BE");      
content.getBytes("UnicodeBigUnmarked")