Avatar billede superjma Nybegynder
09. juni 2003 - 16:26 Der er 25 kommentarer og
1 løsning

Mysql, danske tegn

Jeg har problemer med de danske tegn i mysql. Problmet er at de har en forkert encoding eller sådan noget. Jeg kan ikke sammenligne et navn der står rigtigt i databasen som indeholder æøå med en anden streng med æøå. Eks. ser Århus således ud: Ã…rhus . Hvordan sætter jeg hvilken encoding den skal læse med således at det er muligt at sammenligne to strenge. Den streng der skal sammenlignes med, er en hjemmeside. Dvs. om ordet står på denne side (urls[] er et array over alle de hjemmesider den skal læse fra ):

for(int i=0;i<urls.length;i++){
  URL liste = new URL(urls[i]);
  BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream()));
  String inputLine;
  String sqlTxt="SELECT navn from tabelnavn";
  try{
    while ((inputLine = in.readLine()) != null){
    ResultSet r=DriverManager.getConnection(url).createStatement().executeQuery(sqlTxt);
      while(r.next()){
    if(inputLine.indexOf(r.getString("navn"))>0){...

Håber der er en der ved hvordan man skal håndtere disse tegn.
Avatar billede arne_v Ekspert
09. juni 2003 - 17:44 #1
Prøv og erstat:

r.getString("navn")

med:

new String(r.getBytes("navn"), "ISO-8859-1")

eller:

new String(r.getBytes("navn"), "UTF-8")
Avatar billede superjma Nybegynder
09. juni 2003 - 17:58 #2
Det har jeg prøvet.. og nu én gang til. Det virker ikke.. Ingen af dem
Avatar billede arne_v Ekspert
09. juni 2003 - 18:12 #3
Har du prøvet med UTF-16 og UTF-32 også ?
Avatar billede arne_v Ekspert
09. juni 2003 - 18:14 #4
Og du skulle da ikke have accepteret mit svar når det ikke virkede.

Je vil naturligvis fortsætte med at hjælpe men jeg kan ikke garantere
at jeg kan finde en løsning.
Avatar billede mosquito Nybegynder
09. juni 2003 - 18:20 #5
måske din opsætning af os har svaret. kontrolpanel -> region og sprog -> advanced -> vælg dansk.. (ved XP), måske det vil hjælpe
Avatar billede superjma Nybegynder
09. juni 2003 - 18:59 #6
Det var også et uheld:-)

Jeg tror det ikke, for mit filsystem er UTF-8. (Linux Redhat 9).

Men nu har jeg prøvet alligevel. UTF-16 går det helt galt. UTF-32 er unsupported: java.io.UnsupportedEncodingException: UTF-32
Avatar billede arne_v Ekspert
09. juni 2003 - 19:18 #7
Umiddelbart ville jeg også have troet at ISO-8859-1 var det rigtige.

Kan du se hvad præcis den returnerer for "Århus" ?

byte[] b = r.getBytes("navn");
for(int i = 0; i < b.length; i++) {
  System.out.println(b[i]);
}

eller lignende.
Avatar billede superjma Nybegynder
09. juni 2003 - 19:32 #8
Ja det blev jeg jo noget klogere af:
-61, ᅢ
-123, ï¾…
114, r
104, h
117, u
115, s
NEGATIVE værdier.. dem har jeg aldrig hørt om før!
Avatar billede arne_v Ekspert
09. juni 2003 - 19:35 #9
byte er signed !

-61 = C3 hex = 195

-123 = 85 hex = 133
Avatar billede arne_v Ekspert
09. juni 2003 - 19:39 #10
Meget mystisk.

import java.io.UnsupportedEncodingException;

public class Enc {

    public static void main(String[] args) {
        byte[] b = {-61,-123,114,104,117,115 };
        try {
            System.out.println(new String(b, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

skriver korrekt Århus ud hos mig !

(men det er Win2000)
Avatar billede superjma Nybegynder
09. juni 2003 - 19:40 #11
Det siger mig ikke meget.. Hvad skal man gøre for at sammenligne dem så. Altså med almindelige Strings?
Avatar billede carstenknudsen Nybegynder
09. juni 2003 - 19:47 #12
Prøv at udføre kommandoen
mysqladmin -u root -p show variables
og kig efter character_set, der står hvad der bruges, hos mig står der latin1 (der er det samme som iso-8859-1), og under character_sets står der hvilke karaktersæt der understøttes.
Avatar billede arne_v Ekspert
09. juni 2003 - 19:48 #13
Hvad får du med det lille test-program, på din Linux box ?
Avatar billede superjma Nybegynder
09. juni 2003 - 20:48 #14
Hvis jeg henter fra databasen har søndag værdien: (83, -61, -72, 110, 100, 97, 103). Mens den fra en hjemmeside har værdien: (83, -17, -65, -67, 110, 100, 97, 103)

Jeg får også latin one. Skrevet til consollen får jeg Århus men til en fil noget mærkeligt noget.
Avatar billede arne_v Ekspert
09. juni 2003 - 20:57 #15
Jeg tror at du skal sige at UTF-8 er OK når du henter fra databasen og
så fokusere på at få det rigtigt til fil.
Avatar billede arne_v Ekspert
09. juni 2003 - 21:00 #16
Prøv evt. at angive encoding i output:

new PrintStream(new FileOutputStream(filename), true, "UTF-8")
new PrintStream(new FileOutputStream(filename), true, "ISO-8859-1")
Avatar billede arne_v Ekspert
09. juni 2003 - 21:02 #17
Jeg er iøvrigt lidt puzzeled over at

-17, -65, -67 = ø

det ligner ikke en encoding som jeg har set før.
Avatar billede superjma Nybegynder
09. juni 2003 - 21:45 #18
Jeg har ikke behov for at gemme i en fil pt. Kun at sammenligne med en hjemmeside. Grunden til at jeg skrev at det var anderledes i en fil var at jeg redirectede outputtet (med >) fra skærmen til en fil så jeg havde lidt bedre tid til at læse det.

Får du det ikke til et ø på din maskine?
Avatar billede arne_v Ekspert
09. juni 2003 - 21:58 #19
Jeg kan ikke få den 3 byte sekvens til ø på nogen måde.

Hvis vi vidste hvilken encoding det var, så var det formentlig
ikke noget problem at få det til at virke.
Avatar billede superjma Nybegynder
09. juni 2003 - 22:38 #20
Prøv at køre det her:
import java.net.*;
import java.io.*;
import java.sql.*;


public class test {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost/aktier?user=root";
        Class.forName("org.gjt.mm.mysql.Driver");

        String sqlTxt;
        sqlTxt="SELECT navn from aktier";

        try{
            URL liste = new URL("http://www.xcse.dk/dk/aktier/25/index.asp");
            BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null){
                if(inputLine.indexOf("Søndagsavisen")>0){
                    System.out.println(inputLine);
                    System.out.println(inputLine.substring(200,206));
                }
            }
            byte[] b = {83, -17, -65, -67, 110, 100, 97, 103};
            System.out.println("XCSE:" + new String(b, "UTF-8"));
            byte[] ba = {83, -61, -72, 110, 100, 97, 103};
            System.out.println("DB:" + new String(ba, "UTF-8"));
        }
        catch(Exception e){System.out.println(e);}
    }
}
Det kan være det hjælper.. (Måles er at lave min egen database med historisk data over mine aktier, uden at gøre det manuelt hver uge)
Avatar billede arne_v Ekspert
09. juni 2003 - 22:45 #21
Jeg får:

Søndag
XCSE:S?ndag
DB:Søndag
Avatar billede arne_v Ekspert
09. juni 2003 - 22:48 #22
Har du prøvet med:

BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(), "UTF-8"));
BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(),"ISO-8859-1"));
Avatar billede superjma Nybegynder
10. juni 2003 - 11:31 #23
BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(),"ISO-8859-1"));

Ser ud til at virke bortset fra at jeg får nogle java.lang.StringIndexOutOfBoundsException: String index out of range: -43 nu.. Meeeen det burde da være muligt at løse...:-)
Avatar billede superjma Nybegynder
12. juni 2003 - 00:06 #24
Nu er der igen problemer med æøå i databasen. Det var ikke muligt at opdatere et felt med æøå i primærnøglen, dvs. i where-sætningen. Det problem løste jeg efter mange hårde timer ved at opdatere min connection-driver til nyeste version "mysql-connector-java-3.0.8" istedet for min gamle "mm.mysql-2.0.11". Dette løste problemet. Dog er der opstået et nyt. De data jeg henter er i et forkert format så jeg ikke længere kan sammenligne med det fra min BufferedReader!!!:-(  Jeg er ret træt af danske tegn. Er det virkeligt nødvendigt at konvertere frem og tilbage hver gang, og hvor mange tegn skal så konverteres? (æøåÆØÅ - men hvad med é og andre special tegn)

Jeg har testet det både i Windows og linux, og fejlen går igen begge steder!
Avatar billede arne_v Ekspert
12. juni 2003 - 07:42 #25
Hvis ÆØÅ virker med noget encoding så vil det formentlig være alle
de sprog-specifikke (ihvertfald vesteuropæiske) tegn der OK:

Det er specielt på nyere Linux med Java at det driller - jeg har en
mistannke om at Linux og Java folket ikke har fået koordineret
skiftet fra ISO-8859-1 til UTF-8 godt nok.

Og resultatet er et mareridt for programmørerne.

Når nu du har opdateret driver så starter du forfra !

getString/getBytes ISO-8859-1/getBytes UTF-8

open/open ISO-8859-1/open UTF-8

der er kun 9 kombinations-muligheder.
Avatar billede superjma Nybegynder
12. juni 2003 - 19:28 #26
HEHE så virker det!
BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(), "ISO-8859-1"));

og

new String(r.getBytes("navn"), "UTF-8")

og om den så ikke dæleme knurme vil have new String(key.getBytes(), "ISO-8859-1") når man skriver det i where-sætningen i sin update...

Ja den var jo ikke sådan lige at lure.. tak for hjælpen... den trak altså også hår ud!
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