2010-06-10 4 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

Non-UTF8? Хотите немного сузить это? Это легко, если вы знаете кодировку ввода и, по сути, невозможны, если вы этого не сделаете. –

+0

некоторые соображения, файлы BIG (например, 1 ГБ), поэтому я не могу поместить их в объект String ... –

+0

Какова кодировка вашего файла? Если вы работаете в Linux или OS X (и других Un * x), вы можете просто ввести: * файл some_file *, и он должен указать вам кодировку. Кстати, если вы используете Un * x (по крайней мере, как Linux, так и OS X), вы должны иметь командную строку * iconv *. * «man iconv» * говорит: * «Конвертировать кодированные данные из одной кодировки в другую» *, которая, возможно, будет лучше работать в 1 ГБ-файле, чем самозаписываемое Java-приложение. Обратите внимание, что кодировка UTF-8 может представлять каждый отдельный код Unicode, поэтому, говоря, что у файла * "есть некоторые символы не-utf8" * звучит сомнительно ... – NoozNooz42

ответ

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

+2

, конечно, нет, это всего лишь один возможный способ. – leonbloy

+0

Потенциальная проблема при чтении по очереди заключается в том, что вы можете изменять окончание/разделение строк. Например, если в последней строке нет конца строки, вы добавите ее. –

1

Вы только хотите, чтобы прочитать его как UTF-8? То, что я недавно давал аналогичную проблему, - это запустить JVM с -Dfile.encoding = UTF-8 и читать/печатать как обычно. Я не знаю, применимо ли это в вашем случае.

С этой опцией:

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

печатает правильно символы. В противном случае он печатает? символ

+2

http : //bugs.sun.com/view_bug.do? bug_id = 4163515 – McDowell

+0

@McD: Я собирался опубликовать тот же комментарий. Это неправильное толкование использования '-Dfile.encoding'. – BalusC

+0

Я вижу, это действительно беспорядок. – Ismael

4

Вам необходимо знать кодировку входного файла. Например, если файл находится в Latin-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

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(); 
     } 
    } 
} 

--EDIT--

Использование 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

Смежные вопросы