JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區 » IO/Streams  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 請教中文名稱轉換的問題
genovalee





發文: 10
積分: 0
於 2011-05-30 17:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
根據網路上找到的中文字串解決方式:
Java采用Unicode碼編碼方式,中英文字符均采用16bit存儲。
既然存儲英文信息是正確的,根據一定規則,將中文信息轉換成英文信息后存儲,
自然不會出現截尾現象。讀取信息時再進行逆向操作,將英文信息還原成中文信息即可。
由GB2312編碼規則可知,漢字一般為二個高位為1的ASCII碼,
在轉換時將一個漢字的二個高位1去掉,還原時再將二個高位1加上。
為了處理含有英文字符的中文字串,對英文字符則需要加上一個Byte 0標記。原作者說
實際編程中效果很好,只是存儲的中文信息需要經過同樣處理,才能被其他系統使用....
所以我寫了一支測試程式,中文字串轉成英文訊息後卻轉不回中文字串,測試環境是使用MS950編碼,是因為編碼與原作者使用GB2312不同,所以測試結果也不同嗎?
有沒有JAVA達人可以指導一下?感激不盡

從英文字串轉回中文字串時,回傳共21個字節,扣掉英文補0的7個字節,應該是14個字節,結果卻會發生ArrayIndexOutOfBoundsException,真的很奇怪.....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class StringBufferTest  {
    /**
     *將中文字串轉換成英文字串
     */
    public static String tranToAsciiStr(String str) {
      StringBuffer sb = new StringBuffer();
      byte[] bt = str.getBytes();
      for(int i=0 ; i < bt.length ; i++){
        if(bt[i] < 0){ 
          //中文去高位1
          sb.append((char)(bt[i]&0x7f));
        }else{//是英文字符補char(0)做紀錄
          sb.append((char)0);
          sb.append((char)bt[i]);
        }
      }
      return sb.toString();
    }
    /**
     *將英文字串轉換成中文字串
     */
    public static String tranToChtStr(String str) {
      byte[] bt = str.getBytes();
      int i,l = 0,j = 0,length = bt.length;
      for(i=0;i<length;i++){  //計算補幾個char(0)
        if(bt[i] == 0) {
          l++;
        }
      }
      byte[] bt2 = new byte[bt.length-l];
      for(i=0;i<length;i++){
        if(bt[i] == 0){
          i++;
          bt2[j] = bt[i];
        } else {
          bt2[j] = (byte)(bt2[i]|0x80);
        }
        j++;
      }
      String tt = new String(bt2);
      return tt;
      }
  public static void main(String[] args)  {
    StringBuffer buf = new StringBuffer();
    String new_name;
    String old_name;
    
    buf.append("這是一本good書");
    System.out.println("Append String: " + buf);
    //中文字串轉換成ascii string
    new_name = tranToAsciiStr(buf.toString());
    System.out.println(new_name);
    //ascii string轉換回中文字串
    old_name = tranToChtStr(new_name);
    System.out.println(old_name);
  }
}

執行結果與預期不符
[img]
[/img]


genovalee edited on 2011-05-30 17:23
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
832 請教中文名稱轉換的問題 genovalee 2034 2011-05-30 17:05
666 Re:請教中文名稱轉換的問題 Duncan 957 2011-05-30 20:07
736 Re:請教中文名稱轉換的問題 genovalee 32 2011-05-30 21:17
» JWorld@TW »  Java SE 討論區 » IO/Streams

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8