Avatar billede petermjensen Nybegynder
25. december 2005 - 15:48 Der er 29 kommentarer og
1 løsning

Forståelse af java og encodings

Hej Eksperter,
Jeg sidder og legere med lidt fil konvertering.
Mit problem er dog at konverterer æøå til en char.
Jeg bruger FileInputStream og konvertere selv bogstaverne.
Jeg konvererer bogstaverne sådan:
char mitBogstav = (char)bytes[x];
Men når jeg kommer til æøå for jeg bare et '?'.

Når jeg kigger på min jvm's default encodings, står den på 'ISO8859_1'.
Og når debugger for at se hvad byten er for f.eks. 'å' er den som rigtig lig med 229.

Burde det så ikke virke?
Avatar billede arne_v Ekspert
25. december 2005 - 15:52 #1
229 er rigtig

men hvordan skriver du den ud hvor du ser det ?
Avatar billede petermjensen Nybegynder
25. december 2005 - 16:07 #2
arne_v, også her i java? Du er da godt nok allesteder :)

Jeg skriver det ud i prompten (linux - bash), og kigger på den i eclipse's debugger.
Begge steder får jeg et '?'.
Jeg prøver også at lave et lille check:
if (minByte == (byte)229)
{
    if ((char)minByte == 'å')
        System.out.println("Found å");
}
Men den kommer ikke til ((char)b == 'å')
Avatar billede arne_v Ekspert
25. december 2005 - 16:11 #3
hvad hvis du kører med:

java -Dfile.encoding=ISO8859-1 ...
Avatar billede petermjensen Nybegynder
25. december 2005 - 16:25 #4
Den gør stadig det samme når jeg køre med:
-Dfile.encoding=ISO8859-1
Avatar billede arne_v Ekspert
25. december 2005 - 16:29 #5
hvad så hvis vi skifter til:

-Dfile.encoding=UTF-8
Avatar billede petermjensen Nybegynder
25. december 2005 - 16:30 #6
Stadig det samme
Avatar billede petermjensen Nybegynder
25. december 2005 - 16:38 #7
Hov jeg prøvede lige følgene:

String encProperty = System.getProperty("file.encoding");
String byteToCharClass =
sun.io.ByteToCharConverter.getDefault().getClass().getName();
String charToByteClass =
sun.io.CharToByteConverter.getDefault().getClass().getName();

System.out.println("encProperty == '" + encProperty + "'");
System.out.println("Default ByteToChar Class == '" + byteToCharClass + "'");
System.out.println("Default CharToByte Class == '" + charToByteClass + "'");

Dette returnerer:

encProperty == 'UTF-8'
Default ByteToChar Class == 'sun.io.ByteToCharISO8859_1'
Default CharToByte Class == 'sun.io.CharToByteISO8859_1'

encproperty er lig utf-8.. Det er underligt?
Avatar billede petermjensen Nybegynder
25. december 2005 - 16:40 #8
Hov.. det var fordig jeg lige kørte den med
-Dfile.encoding=UTF-8

Men den skifter ikke bytetochar encoding med -Dfile.encoding=UTF-8.
Avatar billede arne_v Ekspert
25. december 2005 - 16:51 #9
vi mangler en brik til puslespillet

du læser filer ind som bytes

filerne indeholder ISO-8859-1

du konverterer fra byte til char med et cast

hvad sker der hvis du konverterer fra byte array til String ?
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:00 #10
Filen er faktisk en binær fil. Det vil sige at noget af det er nogle bytes (nogle integers ) skrevet med shifting. (dog er æøå skrevet som ascii 8859_1)
Jeg læser filen ind i et byte array med fileInputStream.
Avatar billede arne_v Ekspert
25. december 2005 - 17:01 #11
kommer

System.out.println((char)229);

ud som å eller som ?
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:04 #12
"hvad sker der hvis du konverterer fra byte array til String ?"
Så sker det samme.
Jeg har osse prøvet String s = new String(andenString.getBytes("8859_1"));
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:05 #13
System.out.println((char)229);
Underligt. Den kommer søreme ud som 'å'
Avatar billede arne_v Ekspert
25. december 2005 - 17:06 #14
Og hvad sker der hvis du erstatter:

System.out.println(noget);

med

PrintStream ps = new PrintStream(System.out, true, "ISO8859-1");
ps.println(noget);

eller

PrintStream ps = new PrintStream(System.out, true, "UTF-8");
ps.println(noget);
Avatar billede arne_v Ekspert
25. december 2005 - 17:07 #15
ah

men

if (minByte == (byte)229)
{
    if ((char)minByte == 'å')
        System.out.println("Found å");
}

fejler stadig ?
Avatar billede arne_v Ekspert
25. december 2005 - 17:08 #16
og stadig på yderste test ?
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:10 #17
Jep.

if (minByte == (byte)229) kan den godt.
Men ikke:
if ((char)minByte == 'å')
        System.out.println("Found å")
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:11 #18
"og stadig på yderste test ?"
Jeg forstår ikke hvad du mener?
Avatar billede arne_v Ekspert
25. december 2005 - 17:14 #19
men

if ((char)minByte == (char)229)

virker vel
Avatar billede arne_v Ekspert
25. december 2005 - 17:16 #20
hvad giver

System.out.println((int)'å');

?
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:16 #21
nej det virker.
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:17 #22
System.out.println((int)'å');
Giver 229
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:18 #23
Hov.
Jeg skulle skriver:
if ((char)minByte == (char)229) virker ikke.
Men
if (minByte == (byte)229) virker
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:25 #24
Hvis jeg bruger en InputStreamReader (både ved at specificere encodingen, og uden) virker det som det skal med æøå.
Avatar billede petermjensen Nybegynder
25. december 2005 - 17:34 #25
Men det er ikke optimalt at bruge inputstreamreader til mit formål, da jeg jo egentligt før det samme som den. (holder styr på mine bytes etc)
Avatar billede petermjensen Nybegynder
25. december 2005 - 18:24 #26
Hov.

Jeg kopierer et sted kopierer jeg mit byte array til et andet byte array bare ved at:
srcArr = dstArr;

Hvis jeg ikke kopier array'et virker det!?
Underligt.

Nå pyt skidt. Nu kan jeg komme videre :)
arne_v, Tusind tak for hjælpen!
Vil du ikke lige lægge et svar, så jeg kan give dig point?
Avatar billede arne_v Ekspert
25. december 2005 - 19:08 #27
Du mner vel

dstArr = srcArr;

?

Det kopierer *ikke* arrayet. Det laver en ny reference til det samme array.

byte[] b1 = new byte[100];
byte[] b2 = b1;

svarer til C++:

char *b1 = new char[100];
char *b2 = b1;
Avatar billede arne_v Ekspert
25. december 2005 - 19:09 #28
du kan muligvis bruge

dstArr = (byte[])srcArr.clone();
Avatar billede arne_v Ekspert
25. december 2005 - 19:10 #29
jeg er dog stadig lidt mystificeret

hvilken java version bruger du ?

kan ses med:

java -version
Avatar billede petermjensen Nybegynder
30. december 2005 - 17:53 #30
arne_v, undskyld min lange svartid!

Jeg må sige at jeg havde lavet en stor brøler!
Jeg havde en metode fileOpen(String filename)
Jeg havde også en global array bytes[] som indeholdt bytes fra filen.

I min fileOpen metode gjorde jeg følgene:
Læste alle bytes ind i en lokal variabel= tmpBytes.
og inde i metoden kopierede jeg den lokale tmpBytes til min dstBytes ved at:
dstArr = srcArr ( istedet for som du skrev at clone den)

Det var en ret STOR fejl i sig selv!! Dog er det mærkeligt at mit problem med æøå opstod.. Problemet blev løst når jeg direkte læste bytesne ind i min globale array.

Mit Java version:
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)

Tusind tak for hjælpen arne_v!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester