Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 22:31 Der er 12 kommentarer og
1 løsning

æøåÆØÅ-problem (database-udtræk)

Jeg har en lille simpel database-applikation afviklet i konsol under windows2000. Databasen er en dansk MS Access 2000. Se koden nedenfor. Det her er lidt tricky.
Når jeg benytter ("C:\Program Files\j2sdk1.4.0\bin\java.exe" -cp C:\Java\Telefon -Dfile.encoding=Cp850 telefon) til afvikling så bliver "æøåÆØÅ"-tekst direkte i koden udskrevet rigtigt mens den samme tekst fra databasen ender på skærmen som ukendte tegn.
Når jeg benytter ("C:\Program Files\j2sdk1.4.0\bin\java.exe" -cp C:\Java\Telefon telefon) til afvikling så bliver "æøåÆØÅ"-tekst direkte i koden udskrevet som ukendte tegn og fra databasen er det æ, ø, å og Æ der vises rigtigt mens Ø og Å vises som spørgsmålstegn.
Er der nogen der kan finde den gyldne forklaring?


Er du der, arne_v???


import java.io.*;
import java.net.URL;
import java.sql.*;

class telefon {
  static Connection cnnTelefon;

  public static void main (String args[]) {
    System.out.print("\n");
    while (true) {
      try {
        InputStreamReader objInputStream = new InputStreamReader(System.in, "CP850");
        BufferedReader objInputBuffer = new BufferedReader(objInputStream);
        System.out.print("æøåÆØÅ Search> ");
        System.out.flush();
        String strInput;
        strInput = objInputBuffer.readLine();
        String strURL = "jdbc:odbc:Telefon";
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        cnnTelefon = DriverManager.getConnection(strURL);
        System.out.print("\n");
        printResult(strInput);
      }
      catch (IOException ex) {
        System.out.println(ex.getMessage());
      }
      catch (SQLException ex) {
        System.out.println(ex.getMessage());
      }
      catch (java.lang.Exception ex) {
        ex.printStackTrace(); 
      }
    }
  }

  public static void printResult(String strSearch) {
    try {
      Statement objStatement = cnnTelefon.createStatement();
      String    strSQL = "SELECT * FROM tblTelefon WHERE strNavn LIKE '%" + strSearch + "%' OR strOrd LIKE '%" + strSearch + "%'";
      ResultSet rstTelefon = objStatement.executeQuery(strSQL);
      String    strName;
      String    strTlf;
      int      intNumOfRows;

      intNumOfRows = 0;
      while (rstTelefon.next()) {
        strName = rstTelefon.getString("strNavn");
        strTlf = rstTelefon.getString("strTlfNummer");
        String strOut = " " + strName + ": " + strTlf;
        try {
          System.out.print(new String(strOut.getBytes("CP850")));
        }
        catch (UnsupportedEncodingException ex) {
          System.out.println(ex.getMessage());
        }
        System.out.print("\n");
        intNumOfRows =+ 1;
      }
      if (intNumOfRows == 0) {
        System.out.print(" No rows found" + "\n");
      }
      System.out.print("\n");
    }
    catch (SQLException ex) {
      System.out.println (ex.getMessage());
    }
  }
}
Avatar billede arne_v Ekspert
06. februar 2003 - 22:41 #1
Jeg er her.
Avatar billede arne_v Ekspert
06. februar 2003 - 22:43 #2
Hvd sker der hvis du erstatter:

      String strOut = " " + strName + ": " + strTlf;
        try {
          System.out.print(new String(strOut.getBytes("CP850")));
        }
        catch (UnsupportedEncodingException ex) {
          System.out.println(ex.getMessage());
        }
med:

      String strOut = " " + strName + ": " + strTlf;
      System.out.print(strOut);

og med -Dfile.encoding=Cp850 ?
Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 22:56 #3
Der sker det samme. Ingen forskel.
Avatar billede arne_v Ekspert
06. februar 2003 - 23:04 #4
Prøv med:
        System.out.write(strOut.getBytes("CP850"));
uden -Dfile.encoding=Cp850 !
Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 23:16 #5
Jeg tilføjede lige den rette exception-håndtering og det blev interessant.
"æøåÆØÅ" fra databasen blev perfekt, men den direkte tekst dumper.
Jeg tror du er tæt på.
Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 23:19 #6
Jeg kan nok ikke få begge dele, vel?
Avatar billede arne_v Ekspert
06. februar 2003 - 23:20 #7
Og du bruger write (ikke println) og har brugt getBytes("CP850")
usen new String på den direkte tekst ?
Avatar billede arne_v Ekspert
06. februar 2003 - 23:23 #8
Du skal kunne få begge dele.

String pmt = "æøåÆØÅ Search> ";
System.out.print(pmt.getBytes("CP850"));

troede jeg ville virke.
Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 23:31 #9
Ja, jeg har brugt write istedet for print....og uden String....jeg hár nærlæst  :-)

Brugen af (String pmt) giver mig nogen særdeles underlige tegn  :-)
Avatar billede arne_v Ekspert
06. februar 2003 - 23:34 #10
Og:
  String pmt = "æøåÆØÅ Search> ";
ser korrekt ud i Windows editor menforkert ud i TYPE i DOS ?
Avatar billede jumpingjackflash Nybegynder
06. februar 2003 - 23:42 #11
Ahhhh....du havde fat i det helt rigtige!!!
Det var ikke
String pmt = "æøåÆØÅ Search> ";
System.out.print(pmt.getBytes("CP850"));

men

String pmt = "æøåÆØÅ Search> ";
System.out.write(pmt.getBytes("CP850"));

(som dit tidligere lead)

Ved du hvad, jeg er imponeret.
Du kan dit kram.
Pointene er dine, velfortjent!
Mange tak!
Avatar billede arne_v Ekspert
07. februar 2003 - 07:13 #12
Jeg synes nu nærmest at jeg famler mig lidt frem.

Jeg har lige opdaget at J2SE/JDK 1.4.x har en ny lille feature,
som jeg tror vil være endda meget praktisk for dig:

      PrintStream myps = new PrintStream((OutputStream)System.out, true, "CP850");
      myps.println("æøåÆØÅ");

så kan du bruge println nemt og bekvemt uden hele tiden
at skulle getBytes's.
Avatar billede jumpingjackflash Nybegynder
07. februar 2003 - 11:57 #13
Jeg har lige testet det....med rette exception-handling.....du har ret, det er et godt alternativ.
Igen, mange tak!
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