2010-06-10 154 views
10

我有一個非UTF8字符(如「ISO-8859-1」)的文件,所以我想將該文件(或讀取)轉換爲UTF8編碼,我怎麼能做到這一點?java:如何將文件轉換爲utf8

是這樣的代碼:

File file = new File("some_file_with_non_utf8_characters.txt"); 

/* some code to convert the file to an utf8 file */ 

... 

編輯:把編碼例如

+0

非UTF8?想縮小一點?一旦你知道輸入編碼就很容易,如果你不知道輸入編碼就不可能。 – 2010-06-10 21:26:56

+0

一些考慮,文件是大(如1GB),所以我不能把它們放在一個字符串對象... – 2010-06-10 21:27:37

+0

什麼是您的文件的編碼?如果你在Linux或OS X(和其他Un * x)上,你可以輸入:* file some_file *,它會告訴你編碼。順便說一句,如果你在Un * x(至少Linux和OS X),你應該有* iconv *命令行。 *「man iconv」*表示:*「將給定文件的編碼從一種編碼轉換爲另一種編碼*」,這可以證明在1GB文件上的表現會比自行編寫的Java util表現的更好。請注意,UTF-8編碼可以代表每一個Unicode代碼點,因此表示文件*「有一些非UTF8字符」*聽起來可疑...... – NoozNooz42 2010-06-10 21:32:14

回答

8
String charset = "ISO-8859-1"; // or what corresponds 
    BufferedReader in = new BufferedReader( 
     new InputStreamReader (new FileInputStream(file), charset)); 
    String line; 
    while((line = in.readLine()) != null) { 
    .... 
    } 

有你有文本解碼。你可以用相似的Writer/OutputStream方法編寫你喜歡的編碼(例如UTF-8)。

+0

當然不需要逐行閱讀 – OscarRyz 2010-06-10 21:51:54

+2

,這只是一種可行的方式。 – leonbloy 2010-06-10 22:02:33

+0

逐行讀取的潛在問題是您可以更改行結束符/分隔符。例如,如果最後一行沒有行尾,則會添加一行。 – 2010-06-10 23:35:37

1

你只想讀它作爲UTF-8? 最近我做了一個類似的問題,就是使用-Dfile.encoding = UTF-8啓動JVM,並按正常方式讀/打印。我不知道這是否適用於你的情況。

與該選項:

System.out.println("á é í ó ú") 

打印正確的字符。否則,它打印一個?符號

+2

http ://bugs.sun.com/view_bug.do?bug_id = 4163515 – McDowell 2010-06-10 21:43:39

+0

@McD:我打算髮表相同的評論。這是對'-Dfile.encoding'使用的誤解。 – BalusC 2010-06-10 21:44:19

+0

我明白了,它確實是一團糟。 – Ismael 2010-06-10 22:00:20

4

您需要知道輸入文件的編碼。例如,如果該文件是拉美-1,你會做這樣的事情,

 FileInputStream fis = new FileInputStream("test.in"); 
     InputStreamReader isr = new InputStreamReader(fis, "ISO-8859-1"); 
     Reader in = new BufferedReader(isr); 
     FileOutputStream fos = new FileOutputStream("test.out"); 
     OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); 
     Writer out = new BufferedWriter(osw); 

     int ch; 
     while ((ch = in.read()) > -1) { 
      out.write(ch); 
     } 

     out.close(); 
     in.close(); 
+2

總結:**在文件自己的編碼中讀取**,然後**在新編碼中寫入**。 – BalusC 2010-06-10 21:42:55

14

下面的代碼轉換,從srcEncoding到tgtEncoding文件:

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    BufferedReader br = null; 
    BufferedWriter bw = null; 
    try{ 
     br = new BufferedReader(new InputStreamReader(new FileInputStream(source),srcEncoding)); 
     bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding)); 
     char[] buffer = new char[16384]; 
     int read; 
     while ((read = br.read(buffer)) != -1) 
      bw.write(buffer, 0, read); 
    } finally { 
     try { 
      if (br != null) 
       br.close(); 
     } finally { 
      if (bw != null) 
       bw.close(); 
     } 
    } 
} 

- 編輯 -

使用try-與資源(Java 7中):

public static void transform(File source, String srcEncoding, File target, String tgtEncoding) throws IOException { 
    try (
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(source), srcEncoding)); 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(target), tgtEncoding));) { 
      char[] buffer = new char[16384]; 
      int read; 
      while ((read = br.read(buffer)) != -1) 
       bw.write(buffer, 0, read); 
    } 
} 
+2

忽略我的評論,你是對的。順便說一句,最後還沒有看到這種收場風格。聰明。 – BalusC 2010-06-10 22:31:11