Avatar billede stigc Nybegynder
04. januar 2004 - 18:01 Der er 16 kommentarer og
1 løsning

Streng encoding/decoding m System.out.println

Jeg bruger et projekt som kan læse Ogg comments fra Ogg filer. (Kommetarer i et lyd format, såsom title, kunstner mm.) Kommentaren er encoded med UTF-8. Projektet indeholder en klasse, som har en funktion, som giver mig titlen. Dvs. jeg får en Java streng. Den skrive jeg ud på skærmen (i en cmd boks, under windows 2000) og her ser jeg at æøå er ødelagt. Dvs de fylder 2 tegn. Kan jeg hermed konkluderer at projektet ikke decoder rigtigt? Eller kan fejlen ligge et andet sted? Hvis jeg selv udskrive æøå går det fint!

Selv er jeg næsten overbevist át der må være fejl i projketet, men det undre mig meget da det er fra http://www.jcraft.com/jorbis/. De må da have styr på det....
Avatar billede dsj Nybegynder
04. januar 2004 - 18:23 #1
Projektet decoder højst sandsynligt med US-ASCII hvor alle tegn fylder 2 bytes; i UTF-8 fylder specieltegn nemlig 4 bytes. Prøv at led efter steder i koden, hvor "US-ASCII" er repræsenteret, f.eks. minString.getBytes("US-ASCII");

US-ASCII kan ikke gengive æ, ø og å...
Avatar billede stigc Nybegynder
04. januar 2004 - 18:30 #2
Det er ikke det jeg spørger om. Lad os nu sige jeg ikke har adgang til koden. Kan jeg regne med der er en fejl, eller kan fejlen ligge et andet sted?

Fylder US-ASCII ikke bare en byte p. tegn? Det kan også være de bruger iso-859-1. jeg er egentlig ligeglad, jeg skal bare finde ud af om jeg kan bruge deres projekt til noget.
Avatar billede arne_v Ekspert
04. januar 2004 - 18:33 #3
En Windows 2000 CMD box bruger CP850 eller CP437 encoding (som er 1 byte
per char).

US-ASCII er 1 byte per char og er nederste halvdel af ISO-8859-1, CP hvad
som helst, UTF-8 etc.etc..

UTF-8 er 1 byte per char for US-ASCII chars og 2 byte per char for
special chars herunder danske bogstaver.
Avatar billede arne_v Ekspert
04. januar 2004 - 18:35 #4
At ÆØÅ fylder to tegn skyldes normalt at man læser UTF-8 som ISO-8859-1.

Nemmeste løsning var formentlig bare at konvertere.
Avatar billede dsj Nybegynder
04. januar 2004 - 18:35 #5
Ok, jeg er næsten overbevist om at de anvender US-ASCII. Det er ikke en fejl, men har du ikke koden, må du leve med det. Da det ikke er et dansk projekt, kan du ikke regne med understøttelse af danske tegn. Ingen former for ASCII-tegnsæt understøtter danske tegn, og er samtidig et hyppigt anvendt tegnsæt...
Avatar billede arne_v Ekspert
04. januar 2004 - 18:40 #6
Følgende program illusterer konvertering mellem ISO8859-1 og UTF-8:

public class CharConv {
    public static void main(String[] args) throws Exception {
        String s = "ÆØÅæøå";
        System.out.println(s);
        String s2 = new String(s.getBytes("UTF-8"), "ISO8859-1");
        System.out.println(s2);
        String s3 = new String(s2.getBytes("ISO8859-1"), "UTF-8");
        System.out.println(s3);
    }
}

Output:

ÆØÅæøå
���æøå
ÆØÅæøå
Avatar billede stigc Nybegynder
04. januar 2004 - 18:41 #7
Jeg ved ikke om i er helt med...

Kommentaren skal i følge standarden ligge i UTF-8 i en Ogg fil. Det gør mine kommetarer også. Nu bruger jeg et projekt, som returnere en streng (F.eks titlen på en sang). Når denne streng udskrives til skærmen er den ikke rigtig. Udskriver jeg derimod System.out.println("æøå") så går det fint. CMD box'en kan godt altså godt vise ÆØÅ. Men den Java streng jeg modtager, er vel ødelagt, da projektet åbenbart ikke håndtere UTF-8. Eller hvad?

Det undre mig meget, hvis de har lavet en fejl, for de har jo også lave en Ogg decoder, som jeg er lidt mere omfattende.
Avatar billede arne_v Ekspert
04. januar 2004 - 18:41 #8
Så prøv med:

String strforoutput = new String(strread.getBytes("ISO8859-1"), "UTF-8");
Avatar billede arne_v Ekspert
04. januar 2004 - 18:43 #9
strforoutput = det du vil skrive ud
strread = det du har læst
Avatar billede stigc Nybegynder
04. januar 2004 - 18:46 #10
arne_v >>
Det er ikke en muliged hed, for så mister jeg nogen af de tegn som ikke kan være i ISO8859-1
Avatar billede stigc Nybegynder
04. januar 2004 - 18:47 #11
Jeg tror også selv at den levere mig en streng, læst som ISO8859-1 encoded. Men det undre mig de har lavet den fejl.
Avatar billede stigc Nybegynder
04. januar 2004 - 18:48 #12
Hvis der ellers er nogen utf-8 tegn der ikke kan være i ISO8859-1
Avatar billede arne_v Ekspert
04. januar 2004 - 18:49 #13
Det er der, men de burde *ikke* gå tabt !
Avatar billede stigc Nybegynder
04. januar 2004 - 18:49 #14
Dit eksempel viser jo at ÆØÅ godt kan konverteres frem og tilbage. Men kan man altid regne med dette? Hvad med f.eks et eller andet kinesisk tegn på 4 bytes?
Avatar billede arne_v Ekspert
04. januar 2004 - 18:51 #15
Nu har jeg ikke erfaring med kinesisk !

:-)

Men der burde ikke være nogen problemer.
Avatar billede arne_v Ekspert
04. januar 2004 - 18:56 #16
Lad mig forklare lidt.

Æ

I UTF-8 er det 2 bytes: 195 134

Hvis det blev korrekt indlæst som UTF-8 ville det blive til Unicode 2 bytes: 0 198

Men fordi det læses ind som ISO8859-1 bliver det til Unicode 4 bytes: 0 195 0 134

Det vi så gør er at hive det ud som IS8859-1 til 2 bytes: 195 134

Og så hive det korrekt ind som UTF-8 til Unicode 2 bytes: 0 198

Det burde ikke være noget problem med tegn som ikke kan være i ISO8859-1.

Men test for guds skyld !
Avatar billede stigc Nybegynder
04. januar 2004 - 19:02 #17
Lad os se.. Lukker. :)
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