Avatar billede winston-smith Nybegynder
09. november 2001 - 12:01 Der er 2 kommentarer og
1 løsning

Unicode og streams

Jeg har lavet en font med nogle karaktere der ligger ud over ASCII rækken (over 255). Den vil jeg nu gerne skrive ned på disk. Men når jeg bruger Writer funktionen bliver alle karaktere over 255 og 253, 254 gemt som 63. Hver karakter fylder også kun en byte i filen. Jeg mente ellers at nettop Writer funktione arbejden med java (2 byte) unicode karaktere. Hvordan for jeg dette til at virke? (Har også prøvet med OutputStreamWriter of DataOutputStream uden held)

Kode eksempel:
import java.io.BufferedWriter;
import java.io.FileWriter;

class IOSave extends IO
{
    private BufferedWriter bufferedWriter;
    private String fileName;
    private String data;

    IOSave(String fileName, String data)
    {
        this.fileName = fileName;
        this.data = data;
        initilize();
        writeData();
    }

    private void initilize()
    {
        try
        {
            bufferedWriter = new BufferedWriter(new FileWriter(fileName));
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }

    private void writeData()
    {
        try
        {
            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }
}


-------------------
MED OutputStreamWriter
-------------------

import java.io.OutputStreamWriter;
import java.io.FileOutputStream;

class IOSave
{
    private OutputStreamWriter outputStreamWriter;
    private String fileName;
    private String data;

    IOSave(String fileName, String data)
    {
        this.fileName = fileName;
        this.data = data;
        initilize();
        writeData();
    }

    private void initilize()
    {
        try
        {
            outputStreamWriter = new OutputStreamWriter(new FileOutputStream(fileName));
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }

    private void writeData()
    {
        try
        {
            outputStreamWriter.write(data);
            outputStreamWriter.flush();
            outputStreamWriter.close();
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }
}

-------------------
MED DataOutputStream
-------------------

import java.io.DataOutputStream;
import java.io.FileOutputStream;

class IOSave
{
    private DataOutputStream dataOutputStream;
    private String fileName;
    private String data;

    IOSave(String fileName, String data)
    {
        Debug.debugNewObject(\"IOSave\");

        this.fileName = fileName;
        this.data = data;
        initilize();
        writeData();
    }

    private void initilize()
    {
        try
        {
            dataOutputStream  = new DataOutputStream(new FileOutputStream(fileName));
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }

    private void writeData()
    {
        try
        {
            dataOutputStream.writeChars(data);
            dataOutputStream.flush();
            dataOutputStream.close();
        }
        catch(java.io.IOException e)
        {
            return;
        }
    }
}



Argh!
Rune
Avatar billede disky Nybegynder
09. november 2001 - 12:16 #1
måske er det noget med Locale der driller ?

Eller du skal prøve at konvertere det til et byte array, hvor hvert tegn fylder 2 bytes, og så gemme det istedet.

Avatar billede logical Nybegynder
09. november 2001 - 21:05 #2
Hvis du bruger en DataOutputStream, skal du bruge writeUTF metoden for at skrive det ordentligt.
Avatar billede ulrikm Nybegynder
09. november 2001 - 21:05 #3
Problemet er at FileReader og FileWriter læser og skriver én byte ad gangen. Et forslag er som i nedenstående at lave en FileOutputStream / FileInputStream hvor \'encoding\' specificeres som UTF8:
(undskyld indenteringen..)

class IOSave
{

public static void main( String[] args )
  throws java.io.IOException
{
  java.io.BufferedWriter writer =
  new java.io.BufferedWriter(
  new java.io.OutputStreamWriter(
    new java.io.FileOutputStream(
    new java.io.File(\"out\")),\"UTF8\"));
  String s = \"\"+(char)256;   
 
  writer.write( s, 0, s.length() );
  writer.flush();
  writer.close();
  java.io.BufferedReader reader =
  new java.io.BufferedReader(
    new java.io.InputStreamReader(
    new java.io.FileInputStream(
      new java.io.File(\"out\")),\"UTF8\"));
  System.out.println(reader.read()); //256 hurra!
  reader.close();
}
}

Ulrik Magnusson
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