yegucheng

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            9 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

          筆者的場景是這樣的,筆者使用code smith作為代碼生成工具,并在Eclipse中做插件開發(fā),code smith天生
          對GB的支持比較弱,只能生成UTF-8編碼,這在Eclipse開發(fā)的過程中不會存在問題,但是在使用Eclipse的導(dǎo)出
          功能時(shí),Eclipse底層使用ANT的執(zhí)行方式,ANT的默認(rèn)字符集默認(rèn)使用當(dāng)前系統(tǒng)的字符集,這時(shí)在編譯導(dǎo)出的時(shí)候,
          會出現(xiàn)字符無法識別的問題,導(dǎo)致導(dǎo)出或者打包失敗。
           一種方式可以改變Eclipse工程的默認(rèn)字符集,以及自動生成的ant配置文件中字符集的配置,這對于單個(gè)工程是有
          效的,但處理工程間依賴時(shí),被依賴的工程同樣會出現(xiàn)字符集問題,即使被依賴工程設(shè)定ant的字符集。
           另一種方式,是手工轉(zhuǎn)換,講UTF-8的字符集轉(zhuǎn)換為GBK的,微軟的網(wǎng)站提供了一個(gè)批量轉(zhuǎn)換工具,但是在轉(zhuǎn)換之后,
          文檔的最前面還會有可能存在多于字符,并導(dǎo)致ant打包失敗
           最后,沒辦法自己寫了一個(gè)字符集轉(zhuǎn)換工具,因?yàn)槭亲约河茫詨蛴镁托校旅媸寝D(zhuǎn)換部分的代碼,實(shí)現(xiàn)UTF8到
          GBK的轉(zhuǎn)換,其他轉(zhuǎn)換可以對代碼稍作修改。

           
          import org.apache.commons.lang.ArrayUtils;

          public class EncodeRepairTool {
           public static final byte[] bPre = "EFBBBF".getBytes();
           private int i = 0;

           /**
            * @param args
            */
           public static void main(String[] args) {  
            String path = "D:\\eclipse-dev-3.3\\workspace";
            File file = new File(path);
            EncodeRepairTool scanner = new EncodeRepairTool();
            scanner.scanFolder(file);

           }

           

           public void scanFolder(File file) {
            if (file.isDirectory()) {
             File[] files = file.listFiles();
             for (int i = 0; i < files.length; i++) {
              scanFolder(files[i]);
             }
            } else if (file.getName().endsWith(".java")) {
             removePreCode(file);
            }
           }

           private void removePreCode(File file) {
            try {
             FileInputStream fis = new FileInputStream(file);
             int size = fis.available();
             if (size < 24) {
              return;
             }
             i ++ ;
             byte[] bs = new byte[size];
             fis.read(bs);
             byte[] tbs = ArrayUtils.subarray(bs, 0, 3);
             byte[] tbs1 = new byte[] { new Integer(0xEF).byteValue(),
               new Integer(0xBB).byteValue(),
               new Integer(0xBF).byteValue() };
             boolean bol = false;
             if (tbs[0] == tbs1[0] && tbs[1] == tbs1[1] && tbs[2] == tbs1[2]) {
              bol = true;
             }
             fis.close();
             if (!bol) {
              System.out.println("  " + i + " : " + file.getName());
              tbs = bs;
             }
             else {
              System.out.println("**" + i + " : " + file.getName());
              tbs = ArrayUtils.subarray(bs, 3, size);
              
             }   
             InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(tbs), "UTF-8");
             BufferedReader br = new BufferedReader(reader);
             StringBuffer buffer = new StringBuffer();
             String s = br.readLine();
             while (s != null) {
              buffer.append(s);
              buffer.append("\n");
              s =  br.readLine();
             }
             reader.close();
             byte[] nbs = buffer.toString().getBytes("GBK");   
             FileOutputStream fos = new FileOutputStream(file);
             fos.write(nbs);
             fos.flush();
             fos.close();
             
            } catch (FileNotFoundException e) {
             // TODO 自動生成 catch 塊
             e.printStackTrace();
            } catch (IOException e) {
             // TODO 自動生成 catch 塊
             e.printStackTrace();
            }

           }

          }

          posted on 2007-10-26 10:01 yegucheng 閱讀(2234) 評論(5)  編輯  收藏 所屬分類: Eclipse插件開發(fā)java技術(shù)

          Feedback

          # re: 使用Java API操作文件的字符集 2007-10-26 13:18 bitiwyh
          好像使用ant copy可以指定讀入/寫出出的encoding的.

          encoding/outputencoding.
          不知道行不行.  回復(fù)  更多評論
            

          # re: 使用Java API操作文件的字符集 2007-10-26 13:31 yegucheng
          可以的,ant的javac也可以指定字符集
          但是有三個(gè)問題:
          1. 通過Eclipse的自動生成工具不會生成encoding以及outEncoding的參數(shù)(沒有找到修改Eclipse相關(guān)模板的地方)
          2. 當(dāng)字符集不正確時(shí),編譯的時(shí)候會無法解析java 源文件,必須指定javac的運(yùn)行參數(shù)(印象中好像是在javac)
          3. Eclipse的插件工程存在依賴關(guān)系時(shí),當(dāng)編譯一個(gè)插件,依賴到工作區(qū)的其他插件時(shí),會同時(shí)進(jìn)行編譯,這時(shí)候ant中即使制定了參數(shù)也不會生效,會拋出字符集錯(cuò)誤

            回復(fù)  更多評論
            

          # re: 使用Java API操作文件的字符集 2007-10-26 13:33 yegucheng
          當(dāng)然如果,是在單個(gè)的java工程下,使用ant會簡單很多  回復(fù)  更多評論
            

          # re: 使用Java API操作文件的字符集 2007-10-28 16:06 bitiwyh
          哦,我的意思不是說使用ant javac.
          javac 是可以指定編碼的.

          -
          我是說,用ant copy
          將code smith生成的代碼,使用ant copy --> Eclipse工程目錄.

            回復(fù)  更多評論
            

          # re: 使用Java API操作文件的字符集 2007-10-29 09:16 yegucheng
          呵呵,確實(shí)可以,我開始領(lǐng)會錯(cuò)你的意思了。
          我首先是從微軟的網(wǎng)站下載的轉(zhuǎn)換工具,結(jié)果發(fā)現(xiàn)編譯還是有問題(文檔前端的首字符還是沒有去掉),時(shí)間緊,就自己寫了一個(gè)  回復(fù)  更多評論
            

          主站蜘蛛池模板: 临颍县| 西盟| 科技| 汤原县| 玛纳斯县| 大关县| 读书| 溧水县| 乡城县| 潼南县| 嘉义县| 大连市| 伊通| 丰宁| 略阳县| 新化县| 汉川市| 博罗县| 蚌埠市| 宣化县| 民勤县| 汝阳县| 广元市| 尤溪县| 凉山| 新安县| 新营市| 高唐县| 灵台县| 海口市| 邮箱| 阜南县| 乃东县| 珲春市| 宕昌县| 海伦市| 浦江县| 辰溪县| 武穴市| 茌平县| 嘉禾县|