# Codepage



## Caruso_Nix (10. März 2005)

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


```
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");
      }
```


----------



## yves030 (13. März 2005)

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...


----------



## Caruso_Nix (14. März 2005)

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


----------



## yves030 (14. März 2005)

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:

```
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:

```
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)");
 			}
 		}
 	}
```


----------



## Caruso_Nix (14. März 2005)

danke für die postings.
 caruso


----------

