Hallo!
[f'up nach d.c.l.java]
On 16.05.14 01.57, Christoph Schneegans wrote:
> Hallo allerseits!
>
> Mit einem Java-Programm
>
> final java.io.File original = new java.io.File("/tmp/f�o.txt");
> final java.io.File canonical = original.getCanonicalFile();
> java.lang.System.out.println(original);
> java.lang.System.out.println(canonical);
>
> erhalte ich auf einem Linux-System A folgende Ausgabe:
>
> /tmp/f�o.txt
> /tmp/f?o.txt
Du hast beim �ffnen der Datei keine Codepage (in Java Charset) angegeben.
Default ist 7 Bit ASCII. Da gibt es kein '�'.
Dar�ber hinaus versucht die JVM aus der Systemkonfiguration das Locale
zu ermitteln, und daraus wiederum, wenn m�glich eine andere
Default-Codepage als ASCII. Unter Unix ist die Codepage i.A.
benutzerspezifisch. Es kann also durchaus am angemeldeten User liegen.
Bei Dateinamen kommt noch hinzu, dass diese unter Unix bin�r sind,
hingegen unter Windows Unicode (UCS2). Hei�t, wenn zwei Programme mit
verschiedenen Codepages im selben Unix-Dateisystem herumfuhrwerken,
k�nnen sie unterschiedliche Dateinamen sehen. Unter Windows hingegen
sehen sie solange dieselben Dateinamen, wie alle verwendeten Zeichen in
beiden Codepages existieren - nicht nur, wenn auch ihre Codierung gleich
ist, wie unter Unix. Das gilt auch bei Benutzung �ber das Netzwerk von
einem anderen Rechner aus!
Zuguterletzt gibt es noch das Normalisierungsproblem bei Unicode. Die
Unicode-Darstellung ist nicht immer eineindeutig. Verschiedene Bin�re
Darstellungen k�nnen semantisch gleich sein. Dann hat man bin�r
unterschiedliche Dateinamen, die eigentlich gleich sein sollten. Hei�t
der Zugriff auf den vermeintlich selben Dateinamen endet mit File not
found, weil im Dateisystem nicht dieselbe Unicode-Darstellung verwendet
wurde.
Aus diesem Grund sind Sonderzeichen in Dateinamen immer ein gewisses Risiko.
Unter Linux hat sich zwar UTF-8 recht weit verbreitet, aber nicht alle
Programme kommen mit Multibyte Zeichens�tzen klar.
> Ich sehe zwischen A und B auch keine offensichtlichen Unterschiede;
> Dateisystem ist auf beiden ext3, und env sagt jeweils:
>
> LANG=en_US.UTF-8
>
> Wo k�nnte ich noch schauen?
Die Java-VM k�nnte schlicht buggy sein.
Marcel