Program, który zamienia kodowanie podanego pliku

0

Napisz program, który zamienia kodowanie (stronę kodową) podanego pliku tekstowego. Nazwa pliku, jego kodowanie i kodowanie wynikowe mają być podane jako argumenty wywołania programu.

Do tej pory mam coś takiego:
(argument: java.txt utf-8 cp1250 java2.txt)

import java.io.*;

public class Kodowanie {

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

	    FileInputStream fis = new FileInputStream(args[0]);
	    InputStreamReader isr = new InputStreamReader(fis, args[1]);
	    BufferedReader in = new BufferedReader(isr);

	    FileOutputStream fos = new FileOutputStream(args[3]);
	    OutputStreamWriter osw = new OutputStreamWriter(fos, args[2]);
	    BufferedWriter out = new BufferedWriter(osw);

	    String line = in.readLine();
	    out.write(line);	
		
	}

} 

Ktoś pomoże co robić dalej?
Bardzo proszę o pomoc, wskazówki, cokolwiek.

0

Odczytujesz w pętli linie i zapisujesz, to wszystko.

while(in.ready())
{
    String line = in.readLine();
    out.write(line+"\n");
}
in.close();
out.close();
0

Dzięki :) wszystko super działa.
Mam jeszcze drugie zadanie, które opiera się na kodzie z powyższego (tak twierdzi treść by ten kod użyć)

Stwórz program zmieniający kodowanie plików html. Oprócz zmiany kodowania samych plików należy również zmodyfikować wiersz nagłówka definiujący kodowanie strony,

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">

określający kodowanie po charset=......

Szczerze mówiąc tutaj to już nie wiem zrobić, bo pierwszy raz mam do czynienia z html...

dodanie znacznika <code class="xml"> - @furious programming

0

Musisz wczytać tą linijkę. Zmienić ją na tą na którą chcesz i zapisać do pliku tą zmienioną.

0

W nowszych plikach HTML wiersz definiujący kodowanie wygląda inaczej:

<meta charset="utf-8">

Jak odczytasz linie, to sprawdź czy zaczyna się od <meta

line.trim().toLowerCase().startsWith("<meta">);

jeśli tak, to użyj wyrażeń regularnych do wyszukania Stringa "charset="+args[0] i zastąpienia go Stringiem "charset="+args[1].

0

Jeśli dobrze rozumiem to tak:
W jakimś pliku mam wkleić tą linijkę

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

potem to wczytać jako argument i zmienić kodowanie tak jak w zadaniu 1?

dodanie znacznika <code class="xml"> - @furious programming

0

Raczej nie, argumenty powinny być podane. Ty prócz przepisania pliku z nowym kodowaniem, zmieniasz wiersz opisujący kodowanie.
//Jeśli nie chcesz wylądować w koszu, to używaj znaczników kolorujących składnię.

0

Chyba nie do końca rozumiem.

import java.util.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Konwerter {

	public static void main(String[] args) throws IOException{
		
		Scanner scan = new Scanner(new File(args[0]));

		FileReader fr = null;
		String linia = "";

		   try {
		     fr = new FileReader(args[0]);
		   } catch (FileNotFoundException e) {
		       System.out.println("BŁĄD PRZY OTWIERANIU PLIKU!");
		       System.exit(1);
		   }

		   BufferedReader bfr = new BufferedReader(fr);
		   try {
		     while((line = bfr.readLine()) != null){
		    	 line.trim().toLowerCase().startsWith("<meta");
		    	 Pattern pattern = Pattern.compile("charset=");
		     }
		    } catch (IOException e) {
		        System.out.println("BŁĄD ODCZYTU Z PLIKU!");
		        System.exit(2);
		   }

		   try {
		     fr.close();
		    } catch (IOException e) {
		         System.out.println("BŁĄD PRZY ZAMYKANIU PLIKU!");
		         System.exit(3);
		        }
		    }
		}



	}

} 

Czytam z pliku i potem sprawdzam czy linia ma początek <meta, a gdy taki mam to jak podmienić te argumenty? Mam podać np.coś takiego:

String b = a.replaceAll(args[1], args[2] ); 

?

0

Musisz przepisać cały plik.

while(...){
  if(line.trim().toLowerCase().startsWith("<meta"))
  {
      //sprawdź czy zawiera opis kodowania, jeśli tak, to
      line = line.replaceFirst(args[1],args[2]);
  }
  out.write(line+"\n");
}
0

Wyszło mi coś takiego na razie:

import java.util.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Konwerter {

	public static void main(String[] args) throws IOException{
		
		Scanner scan = new Scanner(new File(args[0]));

		FileReader fr = null;
		String linia = "";

		   try {
		     fr = new FileReader(args[0]);
		   } catch (FileNotFoundException e) {
		       System.out.println("BŁĄD PRZY OTWIERANIU PLIKU!");
		       System.exit(1);
		   }

		   BufferedReader bfr = new BufferedReader(fr);
		   try {
			   while((line = bfr.readLine()) != null){
				   if(line.trim().toLowerCase().startsWith("<meta"))
				   {
					   String regexp = "charset=*";
					   Pattern pattern = Pattern.compile(regexp);
					   Matcher matcher = pattern.matcher("charset="+args[1]);
					   boolean hasMatch = matcher.find(); 
					   if(hasMatch == true){
						   line = line.replaceFirst(args[1],args[2]);}
				   }
				   out.write(line+"\n");
				 }
		     }
		    } catch (IOException e) {
		        System.out.println("BŁĄD ODCZYTU Z PLIKU!");
		        System.exit(2);
		   }

		   try {
		     fr.close();
		    } catch (IOException e) {
		         System.out.println("BŁĄD PRZY ZAMYKANIU PLIKU!");
		         System.exit(3);
		        }
		    }
		}



	}

} 
0

Poprzednio korzystałeś z InputStreamReader i OutputStreamReader i mogłeś ustawić kodowanie. Musisz do tego wrócić. Nie wystarczy zmienić wiersz opisujący kodowanie pliku, samo kodowanie też trzeba zmienić.
Wierszy zaczynających się od znacznika <meta może być wiele, warto kod

                       String regexp = "charset=*";
                       Pattern pattern = Pattern.compile(regexp);
                       Matcher matcher = pattern.matcher("charset="+args[1]);

przenieść przed pętlę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1