posts - 5,  comments - 6,  trackbacks - 0

          首先閱讀此文之前,最好閱讀
          http://hi.baidu.com/maml897/blog/item/324bf86369961ed4e6113a5c.html

          http://hi.baidu.com/maml897/blog/item/fa5f0a7e1edef00129388ae2.html

          其次還要知道一點常識,就是我們在記事本等一些文本工具中 寫的都是字符,沒有誰會去寫字節(可以寫字節,但是要用具特殊的編輯器),但是其實,我們的寫的是字符,但磁盤上真實存儲的是字節。

          這里就出現了轉換的問題,當然,這些問題記事本本身會幫助我們解決。我們打開一個記事本,然后文件--另存為,你會發現有幾種存儲格式供您選擇,
          ANSI格式:就是ascii的格式
          Unicode格式:采用國際通用的編碼存儲
          Unicode big endian格式:這個和unicode有點區別,但我也不明太具體的不同
          UTF-8:采用utf-8存儲,看過上面的兩篇文章,你會十分的了解這里介紹的編碼。Utf-8,是unicode的一種實現方式。

          例如我們在記事本里面輸入“連通”兩個字。

          1.我們另存記事本的時候,采用unicode存儲,那么雖然我們看到的字符還是“連通”,但是其實存儲在磁盤上的字節 確實
          8FDE(連) 901A (通),這個是規定的,unicode是國際上規定的,給世界上的每個字符分配的唯一編碼。獲取某個字符的unicode的方法,可以去網上查找,最簡單的方法,就是打開word文檔,輸入字符,把光標移動到字符后面,按alt+x,word會自動把字符轉換成unicode編碼,這里呢我們也可以看到,用unicode存儲漢字啊,每個漢字占用兩個字節。

          2.我們另存記事本的時候,采用utf-8存儲,雖然我們看到的字符還是“連通”,但是其實存儲在磁盤上的字節 確實已經變化了,這時候存儲的是
          E8 BF 9E (連)E9 80 9A(通)。這就是utf-8的存儲的編碼,至于utf-8為什么這樣存儲,你可以閱讀上面的兩篇文章來了解,可以看到,utf-8使用3個字節存儲一個漢字。

          另外我們還要知道的就是:電腦怎么區分一個記事本是用什么存儲的呢?
          換句話說,為什么我用unicode存儲的8FDE(連) 901A (通),電腦就知道這是unicode編碼,從而使用unicode解碼,還原為“連通”呢?電腦又怎么知道E8 BF 9E (連)E9 80 9A(通)這是按照utf-8的存儲方式存儲的呢?

          這里有一點標記,就是在存儲字節的時候,記事本首先在最前面 標明,這個記事本下面的存儲格式 是utf-8,還是unicode。

          例如,

          1.unicode存儲“連通”。磁盤字節真實存儲的其實是:

          FF FE 8FDE 901A

          前兩個FF FE是標記,告訴電腦,這個文檔的存儲方式是unicode

          2.utf-8存儲“連通”。磁盤字節真實存儲的其實是:

          EF BB BF E8 BF 9E E9 80 9A

          前三個EF BB BF 告訴電腦 這個文檔是utf-8存儲的

          根據不同編碼的特點和標志,對一個文本文件判斷編碼方法如下
          1  .  UTF7  所有字節的內容不會大于127,也就是不大于&HFF
          2  .  UTF8  起始三個字節為"0xEF 0xBB 0xBF"
          3  .  UTF-16BE 起始三個字節為"0xFE  0xFF"
          4  .  UTF-16LE 起始三個字節為"0xFF  0xFE"


          import java.io.BufferedInputStream;
          import java.io.File;
          import java.io.FileInputStream;

          public class FileEncodeReferee
          {
              
          private File file;
              
              
          public FileEncodeReferee(File file)
              
          {
                  
          this.file = file;
              }

              
              
          public FileEncodeReferee(String path)
              
          {
                  file 
          = new File(path);
              }

              
              
          public String getCharset()
              
          {
                  File file 
          = this.file;
                  
                  String charset 
          = "GBK";
                  
          byte[] first3Bytes = new byte[3];
                  BufferedInputStream bis 
          = null;
                  
          try
                  
          {
                      
          //boolean checked = false;
                      bis = new BufferedInputStream(new FileInputStream(file));
                      bis.mark(
          0);
                      
          int read = bis.read(first3Bytes, 03);
                      
          if (read == -1)
                      
          {
                          
          return charset;
                      }

                      
          if (first3Bytes[0== (byte0xFF && first3Bytes[1== (byte0xFE)
                      
          {
                          charset 
          = "UTF-16LE";
                          
          //checked = true;
                      }

                      
          else if (first3Bytes[0== (byte0xFE
                              
          && first3Bytes[1== (byte0xFF)
                      
          {
                          charset 
          = "UTF-16BE";
                          
          //checked = true;
                      }

                      
          else if (first3Bytes[0== (byte0xEF
                              
          && first3Bytes[1== (byte0xBB
                              
          && first3Bytes[2== (byte0xBF)
                      
          {
                          charset 
          = "UTF-8";
                          
          //checked = true;
                      }

                      
          /** */
                      
          /*******************************************************************
                      * bis.reset(); if (!checked) { int loc = 0; while ((read =
                      * bis.read()) != -1) { loc++; if (read >= 0xF0) { break; } if (0x80 <=
                      * read && read <= 0xBF) // 單獨出現BF以下的,也算是GBK { break; } if (0xC0 <=
                      * read && read <= 0xDF) { read = bis.read(); if (0x80 <= read &&
                      * read <= 0xBF)// 雙字節 (0xC0 - 0xDF) { // (0x80 - 0xBF),也可能在GB編碼內
                      * continue; } else { break; } } else if (0xE0 <= read && read <=
                      * 0xEF) { // 也有可能出錯,但是幾率較小 read = bis.read(); if (0x80 <= read &&
                      * read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <=
                      * 0xBF) { charset = "UTF-8"; break; } else { break; } } else {
                      * break; } } } System.out.println(loc + " " +
                      * Integer.toHexString(read)); }
                      *****************************************************************
          */

                  }

                  
          catch (Exception e)
                  
          {
                      e.printStackTrace();
                  }

                  
          finally
                  
          {
                      
          if (bis != null)
                      
          {
                          
          try
                          
          {
                              bis.close();
                          }

                          
          catch (Exception ex)
                          
          {
                              ex.printStackTrace();
                          }

                      }

                  }

                  
          return charset;
              }

              
              
          public static void main(String[] args)
              
          {
                  FileEncodeReferee fer 
          = new FileEncodeReferee("F://鎖表1.sql");
                  System.out.println(fer.getCharset());
              }

          }

          posted on 2010-01-10 19:56 潯陽江頭夜送客 閱讀(404) 評論(0)  編輯  收藏 所屬分類: java
          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          myeclipse6.5上基于JAX-WS開發Webservice(中文示例)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 蕲春县| 射洪县| 抚顺市| 资源县| 清流县| 清水河县| 凤山市| 五台县| 铁岭县| 长丰县| 贵定县| 敦煌市| 闵行区| 依兰县| 虹口区| 鄂托克前旗| 丰都县| 三台县| 商南县| 郸城县| 嘉善县| 安新县| 肃南| 平原县| 洮南市| 台中县| 罗江县| 浑源县| 兰州市| 南丰县| 蒙自县| 大城县| 桂东县| 扎囊县| 岢岚县| 双鸭山市| 浠水县| 泸州市| 米林县| 海晏县| 专栏|