File encoding issues icm Java

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Altijd fijn, file encodings...

Ik heb een tekst bestand, dat UTF-8 encoded zou moeten zijn. Uit mijn terminal:

test.txt: UTF-8 Unicode text, with CRLF line terminators

Alles wel, als ik de file via vim bekijk (ik heb UTF-8 als preferred encoding in mijn vimrc staan) zie ik netjes alle diakrieten.

Echter, nu heb ik een Java tooltje geschreven dat heel simpel de file inleest en de content output naar stdout. Ik start mijn tool met -Dfile.encoding=UTF-8, maar toch komen de diakritische tekens niet goed over.

Zo wordt é getoond als √© en â als √¢

Niet een combinatie die mij bekend voorkomt bij encoding problemen. Iemand een idee?

Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
Een beetje Googlen toont mij dat dit toch een veel voorkomend probleem is. Wat zeggen die links?

Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Sendy schreef op dinsdag 27 oktober 2009 @ 09:34:
Een beetje Googlen toont mij dat dit toch een veel voorkomend probleem is. Wat zeggen die links?
Niet veel.

Ik heb me suf gegoogled, maar ik kom alleen tegen wat ik al probeer (het setten mbv -Dfile.encoding), en dat lijkt ook allemaal goed te gaan.

Vreemde is dat ik laatst al een keer Cp850 moeten gebruiken en dat ging op deze manier wel goed.

Ik gebruik overigens Java 1.6, veel van die links gaan over 1.2

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Hoe lees je de file in dan? Heb je code? Heb je alle API's al doorgelezen?

Sundown Circus


Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
RedRose schreef op dinsdag 27 oktober 2009 @ 10:01:
Hoe lees je de file in dan? Heb je code? Heb je alle API's al doorgelezen?
Te simpel:

Java:
1
2
3
4
5
6
BufferedReader reader = new BufferedReader(new FileReader(new File("test.txt")));
String line = null;
while ((line = reader.readLine()) != null)
{
    System.out.println(line);
}

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Dit kan net zo goed een probleem zijn met het weergeven van de gelezen tekst, als met het inlezen. Wat voor encoding gebruikt je console?

Om te zien of het bestand goed ingelezen wordt, kun je beter gewoon codepoints printen in plaats van karakters. Iets als "íóáß" zou dan 237, 243, 225, 223 op moeten leveren. (Niet met al te grote bestanden testen natuurlijk.)

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Kijk ff naar de java.io.FileReader en java.io.InputStreamReader classes. Daar kan je beter spelen met encoding / decoding. :)
Soultaker schreef op dinsdag 27 oktober 2009 @ 10:07:
Dit kan net zo goed een probleem zijn met het weergeven van de gelezen tekst, als met het inlezen. Wat voor encoding gebruikt je console?

Om te zien of het bestand goed ingelezen wordt, kun je beter gewoon codepoints printen in plaats van karakters. Iets als "íóáß" zou dan 237, 243, 225, 223 op moeten leveren. (Niet met al te grote bestanden testen natuurlijk.)
Kan natuurlijk ook, alhoewel ik denk dat die karakters dubbel UTF-8 geencodeerd worden oid. Ik kan me herinneren dat als je bijvoorbeeld in een JSP pagina de page directive op UTF-8 set en bijvoorbeeld een streamreader in die JSP ook, dat je dan ook van dat soort output krijgt.

[ Voor 74% gewijzigd door RedRose op 27-10-2009 10:09 ]

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Ook mogelijk, maar de code lijkt me correct, zeker als de default encoding gewoon UTF-8 is (wat zeker zo zou moeten zijn wanneer de file.encoding property wordt ingesteld via de command line). Ik denk dat de TS wat moet gaan experimenteren om uit te zoeken wat er precies aan de hand is.

[ Voor 19% gewijzigd door Soultaker op 27-10-2009 10:17 ]


Acties:
  • 0 Henk 'm!

  • iBasch
  • Registratie: Februari 2009
  • Laatst online: 17-09 22:11
Als het goed is wordt je tekst standaard gelezen als UTF-16, unicode. Probeer hem dat maar eens te voeren en kijk wat er uit komt.

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 10:40

Twazerty

AVCHDCoder developer

Debuggen!!!

Ik zit zat met een soortgelijk probleem.Als het goed is zijn je gelezen strings correct maar gaat het bij het printen fout. Voor zekerheid: Gebruik de debugger.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Java:
1
new FileReader(file, "UTF-8")

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
rrrandy schreef op dinsdag 27 oktober 2009 @ 10:03:
[...]


Te simpel:

Java:
1
2
3
4
5
6
BufferedReader reader = new BufferedReader(new FileReader(new File("test.txt")));
String line = null;
while ((line = reader.readLine()) != null)
{
    System.out.println(line);
}
Zoals Macros al zegt: je moet aangeven dat het bestand UTF-8 encoded is, anders wordt default de platform encoding gebruikt door FileReader. Daarnaast is het - iig onder Windows - vaak zo dat (veel) niet ASCII karakters bij afdrukken naar de console als '?' worden weergegeven.

Acties:
  • 0 Henk 'm!

  • iBasch
  • Registratie: Februari 2009
  • Laatst online: 17-09 22:11
Macros schreef op dinsdag 27 oktober 2009 @ 10:52:
Java:
1
new FileReader(file, "UTF-8")
Er is helemaal geen encoding parameter bij FileReader :?
FileReader(File file)
Creates a new FileReader, given the File to read from.
FileReader(FileDescriptor fd)
Creates a new FileReader, given the FileDescriptor to read from.
FileReader(String fileName)
Creates a new FileReader, given the name of the file to read from.
Ik heb het zelf ook ooit geprobeerd overigens, is mij nog niet gelukt in combinatie met FileReader.
Ik kwam uit uiteindelijk hierop uit, per karakter ipv per line. Misschien een beetje omslachtig, maar het werkt wel... Misschien dat iemand anders nog een manier heeft om FileReader goed te laten werken, maar voorlopig heb ik zo opgelost.

Java:
1
2
3
4
5
6
7
8
9
10
11
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
StringBuilder result = new StringBuilder();

while((ch = reader.read()) >= 0)
{
    // Output was uiteindelijk html, vandaar de html chars
    if (ch >= 126 && ch <= 255)
        result.append("&#" + ch + ";");
    else
        result.append((char)ch);
}


Hopelijk heb je er wat aan.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

iBasch schreef op dinsdag 27 oktober 2009 @ 11:38:
[...]

Er is helemaal geen encoding parameter bij FileReader :?
public class FileReader
extends InputStreamReader

Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.

;)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Sorry dat ik de verkeerde oplossing gaf. wat RedRose zegt klopt wel. Ik gebruik meestal FileInputStream en van daaruit ga ik verder. Dan dus naar de InpupStreamReader als je chars ipv bytes wilt. Als er een overloaded methode is waar je de encoding mee kan geven gebruik ik die altijd. Omdat we vaak op Windows ontwikkelen en deployen naar Linux. En die Linux omgevingen ook elke keer anders zijn 'hardcode' ik liever altijd de encoding ipv uit te gaan van een environment variabele, die dan door een beheerder goed gezet moet worden. Ook weet ik nooit zeker of library methodes de default encoding gebruiken als ik niks mee geef, of een andere default. UTF-8 is gelukkig wel enorm standaard tegenwoordig.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Nice, meegeven van de encoding bij het gebruik van een InputStreamReader werkt wel. Tenminste, als ik de -Dfile.encoding=UTF-8 bij de aanroep weghaal...

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Mja, dan zat het probleem toch gewoon in het printen naar de console, zoals ik in mijn eerste reactie al suggereerde. Een InputStreamReader die je UTF-8 als encoding meegeeft werkt precies hetzelfde als een FileReader wanneer de default encoding op UTF-8 staat. Je krijgt er dus precies dezelfde karakters uit.

Het verschil is dat het overriden van de default encoding op de command line waarschijnlijk ook tot gevolg heeft dat Java UTF-8 uitvoer produceert op de console waar iets anders verwacht wordt.
Pagina: 1