Java Codierung - was könnte ich falsch machen

mumfi

Banned
Registriert
Juli 2014
Beiträge
58
Hallo,

ich habe mir ein kleines Java-Programm geschrieben, das den Inhalt einer Webseite liest und in einer MySQL Datenbank speichert.

Auf meinem Windows-Rechner funktioniert es wunderbar.
jetzt möchte ich das Programm aber auf einem Linux-Server laufen lassen.
Und auf dem Linux-Server funktioniert das mit der Codierung nicht so wie gewünscht. (Aus ä wird ä)

Ich habe beidesmal genau den gleichen Java-Code.
Die MySQL Datenbank ist auf beiden Systemen identisch.
Kollation ist auf latin_swedish gestellt.

Hat jemand eine Idee woran das liegen könnte?
 
Wo gehen die Umlaute kaputt? Im quelltext? Wenn ja: darum verwendet man dort keine Umlaute oder ähnliches (zumindest nicht im Code), sondern nur Symbole aus dem ASCII-Satz ;)

Im Programmablauf selbst (eingelesene Datei,...): Dann den Code dazu bitte zeigen.
 
Kollation ist auf latin_swedish gestellt.
Mach daraus mal UTF-8 oder UTF-16 (...was nativ von Java benutzt wird). Auf der Welt gibt es etwas mehr als nur 255 Schriftzeichen.

Ansonsten eben dafür sorgen, dass wirklich überall dieselbe Codierung benutzt wird und dass du v.a. auch deine Webseiteninhalte in der richtigen Codierung ablegst. ä ist ein sicheres Zeichen dafür, dass ein UTF-8-codierter String als Latin-1 o.ä. interpretiert wurde, d.h. du schreibst offensichtlich UTF-8 in die Latin-codierte Datenbank rein. Klar, dass das schiefgeht.

Wenn ja: darum verwendet man dort keine Umlaute oder ähnliches (zumindest nicht im Code), sondern nur Symbole aus dem ASCII-Satz
Deswegen stellt man vor allem erstmal seinen Editor auf UTF-8. In der Microsoft-Welt hat man zwar noch nicht so ganz begriffen, dass es auch sowas wie einheitliche und vollständige Unicode-Zeichencodierungen gibt, aber wir sind nicht mehr im Jahre 1963 und jedes vernünftige Programm unterstützt das, auch wenn es nicht unbedingt standardmäßig eingestellt ist.
 
Ich habe die Datenbank (und auch die einzelnen Tabellen) jetzt auf utf8_bin umgestellt.
Das Problem besteht weiterhin.

Hier mal meinen Code:

Code:
    public static void getContent(String url, String leftlang, String rightlang) throws IOException{
        
        String content = getString(url);
        
           org.jsoup.nodes.Document doc = Jsoup.parse(content);
 
    
            
         Connection conn = null;
   Statement stmt = null;
   try{ 
      Class.forName("com.mysql.jdbc.Driver");
 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
       
      stmt = conn.createStatement();
      
   
      
             links = doc.select(".section-block .result-block");

             int count = 0;
            for (Element element : links) {
               
              
                if(idList.size() > count)
                {
                int id = idList.get(count);
                count++;
                int rowcount = 0;
                Elements rows = element.select(".result-row");
                
                String prepstr = "Insert into word1 (devinition, word_id, language, type, row, description) "
                                + "Values(?, ?, ?, ?, ?, ?) ";
                  PreparedStatement prepStmt = conn.prepareStatement(prepstr);

 
                
                 for (Element row : rows) {
                     rowcount++;
                    if(!row.select(".result-left strong").isEmpty()){
                        
                        String description = row.select(".result-left span").toString();
                        if(description.indexOf("(") > 0 && description.indexOf("(") < description.indexOf(")"))
                        description = description.substring(description.indexOf("("), description.indexOf(")"));
                        else
                            description = "";
                        
                        prepStmt.setString(1, row.select(".result-left strong").text());                        
                        prepStmt.setInt(2, id);
                        prepStmt.setString(3, leftlang);
                        prepStmt.setString(4, row.select(".result-left abbr").text());
                        prepStmt.setInt(5, rowcount);
                        prepStmt.setString(6, description);
                        
                        prepStmt.addBatch();

                    
                    }

                    if(!row.select(".result-right .result-link").isEmpty()){
                        
                        String description = row.select(".result-right span").toString();
                        if(description.indexOf("(") > 0 && description.indexOf("(") < description.indexOf(")"))
                            description = description.substring(description.indexOf("("), description.indexOf(")"));
                        else
                            description = "";
                        
                 
                        
                        prepStmt.setString(1, row.select(".result-right .result-link").text());                        
                        prepStmt.setInt(2, id);
                        prepStmt.setString(3, rightlang);
                        prepStmt.setString(4, row.select(".result-right abbr").text());
                        prepStmt.setInt(5, rowcount);
                        prepStmt.setString(6, description);
                        
                        prepStmt.addBatch();
                    }
                 }
                 
            prepStmt.executeBatch();
            
          try{
                String sql = "update link set issave = true where link.link = ?";
                  PreparedStatement prepsql = conn.prepareStatement(sql);
                prepsql.setString(1, url);
                prepsql.executeUpdate();
 
          }
          catch(Exception ex)
          {
              System.err.println(url);
          }
                   }
            }
 

   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try 
    }

Code:
     public static String getString(String sUrl) throws MalformedURLException, IOException{
        String content = null;
        URLConnection connection = null;
       
          connection =  new URL(sUrl).openConnection();
 
 
          Scanner scanner = new Scanner(connection.getInputStream());
          scanner.useDelimiter("\\Z");
          content = scanner.next();
         
        return content;
    }
 
Lass dir doch mal den Inhalt nach dem Download ausgeben, um erstmal festzustellen ob das Problem beim Lesen der Homepage oder erst beim Speichern in der Datenbank entsteht und teile uns das dann mit.
 
Wenn ich mir den Inhalt direkt nach dem Download anzeigen lasse, dann wird alles richtig dargestellt.

Mir ist jetzt auch aufgefallen, dass die Daten in phpMyadmin nicht richtig dargestellt werden.
Auf meiner (PHP) Weboberfläche ist es aber fast richtig, wenn ich NICHT explizit sage, dass es sich um UTF8 handelt.
ß - werden z.B. generell noch falsch dargestellt
 
Zurück
Oben