Codepage

Caruso_Nix

Mitglied
Wenn ich System.getProperty("file.encoding"); verwende, dann bekomme ich den Codepage Cp1252.
wenn ich p.getInputStream(),"Cp1252" nehme, werden keine Umlaute dargestellt.
Verwende ich dagegen den Cp850, werden diese dargestellt.

Nun ist das Problem, dass ich mein Programm Betriebssystemunabhängig gestalten muss. Also muss ich den Codepage auslesen. aber wie bekomme ich den richtigen?

in der Windows 2000-Registry gibt es unter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
zwei Einträge
OEMCP = 850 --> hier greift die DOS-Konsole zu
ACP = Cp1252 --> hier greift System.getProperty("file.encoding"); zu

Hat jemand eine Idee, wie ich die Codepage dynamisch ermitteln kann? hier muss ich auch Linux abdecken

Code:
    try {
   final Process p =  
  	 Runtime.getRuntime().exec("cmd.exe /c dir c:");
        
    String encoding_system = System.getProperty("file.encoding"); 
    String encoding = "850";
    StringBuffer sb = new StringBuffer();
 BufferedReader br = new BufferedReader(new
   	 InputStreamReader(p.getInputStream(),encoding));
     
     while((line = br.readLine()) != null)
     {	
   	sb.append(line + System.getProperty("line.separator"));
     }
     System.out.println(sb.toString());
   }
      catch(IOException ioe)
      {  
    	System.out.println("IOException");
      }
 
die codepage ermittelst du mit der systemproperty schon richtig...
wenns nicht die 850 ist, mußt du bei deiner ausgabe den stream entsprechend
umcodieren... zwei kleine änderungen an deinem prog reichen:

---snipp---
BufferedReader br = new BufferedReader(new
InputStreamReader(p.getInputStream(),encoding_system));
String line;
while((line = br.readLine()) != null)
{
sb.append(line + System.getProperty("line.separator"));
}
System.out.println(new String(sb.toString().getBytes(),encoding));
}
catch(IOException ioe)
{
System.out.println("IOException");
}

---snapp---

doch dazu noch ein oder zwei anmerkungen..:
ist dieser codeteil teil der "plattformunabhängigen" app oder nur eine demo zur verdeutlichung deines problemes?... ich wundere mich nur, weil:
- es gibt elegantere möglichkeiten, ein verz. zu lesen und dein beispiel ist msdos-spezifisch...
 
Hallo yves030,
dieses Beispiel war nur für den Windowsteil.
Es wäre interessant, deine "elegantere möglichkeiten" zu erfahren. Kannst du mir die mal schicken oder hier posten?

danke caruso
 
na klar... diese varianten sind plattformunabhängig. bsp1 ist die easy version ohne schnickschnack, und wenn du noch so schicke sachen wie anzeige der dateigrößen, kennung ob file oder verzeichnis, zusammenfassung am ende etc. haben willst, dann sieh dir bsp.2 an.
es lassen sich auch filter angeben. sieh´ dir dazu die klassen File bzw. FilenameFilter mal genauer an.

yves030

bsp1:
Code:
 	public static void main(String[] args) {
 		if (args.length!=1) System.err.println ("Bitte Verzeichnis angeben!");
 		else
 		{
 			File f = new File(args[0]);
 			if (!f.isDirectory())
 			    System.err.println ("'"+args[0]+"' ist kein Verzeichnis.");
 			else
 			{
 				String[] contents=f.list();
 			    for (int c=0;c<contents.length;c++) System.out.println(contents[ c]);
 			}
 		}
 	}


bsp2:
Code:
 	public static void main(String[] args) {
 		if (args.length!=1) System.err.println ("Bitte Verzeichnis angeben!");
 		else
 		{
 			File f = new File(args[0]);
 			if (!f.isDirectory())
 			    System.err.println ("'"+args[0]+"' ist kein Verzeichnis.");
 			else
 			{
 				File[] contents=f.listFiles();
 				int fCount=0;
 				int dCount=0;
 				long sizeSum=0;
 			    for (int c=0;c<contents.length;c++){
 				    File nextFile = contents[ c];
 				    String entry = new java.util.Date(nextFile.lastModified()).toLocaleString()+"  ";
 				    int x= (nextFile.isDirectory())? dCount++:fCount++;
 				    entry  += (nextFile.isDirectory()) ? "D" : " ";
 				    entry  += (nextFile.canRead()) ? "R" : " ";
 				    entry  += (nextFile.canWrite()) ? "W" : " ";
 				    entry  += (nextFile.isHidden()) ? "H" : " ";
 				    String fSize = nextFile.length()+"";
 				    sizeSum += nextFile.length();
 				    while (fSize.length()<10) fSize = " "+fSize;
 				    entry += fSize + " " + nextFile.getName();
 				    System.out.println(entry);
 				}
 			    System.out.println (fCount+ " Datei(en) "+sizeSum+" Bytes");
 			    System.out.println (dCount+ " Verzeichniss(e)");
 			}
 		}
 	}
 
Zuletzt bearbeitet:
Zurück