2016年3月3日 星期四

[JAVA]轉換檔案編碼及內容亂碼轉換

[JAVA]轉換檔案編碼


分享三種方式


使用String 轉換-------
package charset;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class StringConv {
 public static void main(String[] args) throws IOException {

   InputStream fin = new FileInputStream(new File("c:\\sample.txt"));
   FileOutputStream fout = new FileOutputStream(new File("c:\\s.txt"));

   byte[] c = new byte[512];
   while (fin.available() > 0) {
     fin.read(c);
     fout.write(new String(c, "big5").getBytes("utf-8"));
   }
   fin.close();
   fout.close();
 }
}




使用 Stream <-> Reader/Writer 轉換-------
package charset;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Conv {
 public static void main(String[] args) throws IOException {

   InputStream fin = new FileInputStream(new File("c:\\sample.txt"));
   InputStreamReader rin = new InputStreamReader(fin, "big5");

   FileOutputStream fout = new FileOutputStream(new File("c:\\s.txt"));
   OutputStreamWriter wout = new OutputStreamWriter(fout, "utf-8");

   char[] c = new char[512];
   while (fin.available() > 0) {
     rin.read(c);
     wout.write(c);
   }
   rin.close();
   fin.close();
   wout.close();
   fout.close();
 }
}


使用Charset 轉換-------
package charset;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.charset.Charset;

public class NConv {
 public static void main(String[] args) throws IOException {

   Charset big5 = Charset.forName("big5");
   Charset utf8 = Charset.forName("utf-8");
   
   FileInputStream fin = new FileInputStream(new File("c:\\sample.txt"));
   FileOutputStream fout = new FileOutputStream(new File("c:\\s.txt"));

   FileChannel fcin = fin.getChannel();
   FileChannel fcout = fout.getChannel();

   MappedByteBuffer mapped = fcin.map(MapMode.READ_ONLY, 0, fin
       .available());

   fcout.write(utf8.encode(big5.decode(mapped)));
   fin.close();
   fout.close();
 }
}


以上內文來自於 JWorld@TW https://goo.gl/ypeCxv


其他相關轉換檔案編碼
以下適用於 檔案內容混雜 \u4fdd 及英文 的檔案


翻譯國外程式變成中文版時,一般程式使用 utf-8碼,但是中文通常用big5 碼
此時翻譯的 中文檔案 需要先轉碼後才可以正確使用 否則會變成亂碼
可用以下方式:
1. 利用 java native2ascii 程式:
需要安裝 任何一版 java SDK
於 安裝目錄下假設為 c:\java
則 java\bin\ 有一 nativeascii 程式 可轉碼
假設原本檔案為 mydata.txt 要轉為 utf-8 輸出為 mydata_utf8.txt 請執行以下指令
java\bin\native2ascii -encoding big5 mydata.txt mydata_utf8.txt
即可
若想將轉換後 utf-8檔 變回 big5檔 ,執行以下指令
java\bin\native2ascii -reverse -encoding big5 mydata_utf8.txt mydata.txt


EX: (適用檔案內容混雜 英文及 utf8 編碼用)
java\bin\native2ascii -reverse -encoding utf-8 mydata_utf8.txt mydata.txt

2 則留言 :