Deutsche Umlaute von KVK



  • Hi,

    du hast als "Schriftart" warschndlich "LATIN1" eingestellt. Ist der standart ASCII-Zeichensatz. Die Daten auf der SmartCard sind warscheindlich in einem anderen Zeichensatz gespeichert worden.
    Da alle Umlaute -(minus) 4 Hex (z.b ü(0x81) - 0x4 = }(0x7d))ein bestimmtes Ascii-Zeichen ergeben, könntest du diese Zeichen in einem Switch abfangen und zu daten[cnt] + 4 Hex aufaddieren um auf deine Umlaute kommen.

    Ist nur ne Idee, vielleicht hilfts....



  • Okay, Schriftart war falsch formuliert, aber codeman hat mich verstanden. 🙂

    Was ich machen will ist einfach:
    Ich habe eine typische deutsche Versichertenkarte (die Teile, die man auch beim Arzt vorlegen muss).
    Und ich habe einen Kartenleser auf dem leider weder Typ noch Hersteller drauf steht (das kann ich aber erfragen, der Herstellername war so ein Deutsch-Englisch-Mischmasch, glaube ich).
    Jetzt will ich die Patientendaten da auslesen.

    Das machen wir bisher mit einem Programm das kim.exe heißt. Niemand weiß mehr, wer es wann geschrieben hat und es gibt auch sonst keine Doku.
    Dieses Programm ist die Fehlerquelle pur und macht oft Ärger, deswegen würde ich das gerne neu schreiben.

    Ich werde also mal zum Thema CT-API auf die Suche gehen. Bisher habe ich leider noch Null Ahnung, was mich da erwartet. 😞



  • Hallo,

    codeman schrieb:

    Hi,

    du hast als "Schriftart" warschndlich "LATIN1" eingestellt. Ist der stan**** ASCII-Zeichensatz. Die Daten auf der SmartCard sind warscheindlich in einem anderen Zeichensatz gespeichert worden.
    Da alle Umlaute -(minus) 4 Hex (z.b ü(0x81) - 0x4 = }(0x7d))ein bestimmtes Ascii-Zeichen ergeben, könntest du diese Zeichen in einem Switch abfangen und zu daten[cnt] + 4 Hex aufaddieren um auf deine Umlaute kommen.

    Ist nur ne Idee, vielleicht hilfts....

    Ja, das sieht so aus, wie wenn es daran liegt.
    Zwei Fragen habe ich aber dazu:
    1. Ich muss eine Bedingung einbauen, denn wenn ich alles verschiebe, ist ja der Text falsch.
    Ich brauche eine Bedingung wie "WENN Buchstabe > z DANN um 4 Hex verschieben"
    Ich hab nur keine Idee wie die Bedingung aussehen soll. 😕
    2. Wie kann ich einen CString oder einen unsigned char um 4 Hex ändern???

    estartu_de schrieb:

    Okay, Schriftart war falsch formuliert, aber codeman hat mich verstanden. 🙂

    Was ich machen will ist einfach:
    Ich habe eine typische deutsche Versichertenkarte (die Teile, die man auch beim Arzt vorlegen muss).
    Und ich habe einen Kartenleser auf dem leider weder Typ noch Hersteller drauf steht (das kann ich aber erfragen, der Herstellername war so ein Deutsch-Englisch-Mischmasch, glaube ich).
    Jetzt will ich die Patientendaten da auslesen.

    Das machen wir bisher mit einem Programm das kim.exe heißt. Niemand weiß mehr, wer es wann geschrieben hat und es gibt auch sonst keine Doku.
    Dieses Programm ist die Fehlerquelle pur und macht oft Ärger, deswegen würde ich das gerne neu schreiben.

    Ich werde also mal zum Thema CT-API auf die Suche gehen. Bisher habe ich leider noch Null Ahnung, was mich da erwartet. 😞

    Die kim.exe kenne ich nicht. Nie gehört.
    Wie sieht er denn aus, und was steht drauf? USB? Seriell?
    Ich habe von fast jedem SCM (Towitoko, Chipdrive) ein Muster da...

    Wenn die Anwendung im medizinischen Bereich (Arztpraxen, etc...) eingesetzt wird, sind nur bestimmte Kartenleser zulässig. Diese bringen dann normalerweise bei der Treiberinstallation die CT-API dll mit.

    Wie heist denn die Software in die die Karte eingelesen werden soll?
    Findet man über die Software im Web darüber was?

    mfg
    trequ



  • Die Software, in die die Karte eingelesen werden soll, findet man weder im Web, noch gibt es sie bisher zu kaufen - ich schreibe sie gerade. 😃

    Die alte ist etwa 15 Jahre alt. 🙄

    Ich mach dir gleich mal ein Foto: http://www.larsaf-iii.de/inet/kartenleser.jpg
    Das Teil wird seriell angeschlossen.
    Treiber werden keine installiert, das läuft alles wie zu DOS-Zeiten.

    Zu deinen Fragen:
    du kannst so eine Abfrage machen:

    if (out.GetAt(i) > 'z')
    

    So musst du nun prüfen, ob das ein normaler Buchstabe ist oder nicht. 🙂

    Du kannst auch einen String machen, in dem alle "normalen" Zeichen drin stehen und dann mit Find arbeiten.
    Sowas finde ich einfacher als zig ifs.

    Das out.GetAt(i) kannst du wie eine Zahl behandeln, also addiere das einfach.

    out.SetAt(i, out.getAt(i) + 0x4);
    


  • hi,

    Du kannst auch einen String machen, in dem alle "normalen" Zeichen drin stehen und dann mit Find arbeiten.
    Sowas finde ich einfacher als zig ifs.

    Würd sagen es reicht der if von estartu_de, damit hat man alle herkömmlichen Buchstaben (über 0x7a) abgefragt. Dann im if die addition. Mit der Find-Methode ist es zwar scheinbar angenehmer und einfacher, dauert aber länger, da der String immer von anfang an geparsed werden muss. Der if ist ne schnelle Werteabfrage.

    Ein Prob. ergibt sich nur dann, wenn Zeichen die über 127 oder 0x7a enthalten sind und auch so gewollt sein sollen. Wenn nicht, ist das von estartu_de ne gute Lösung.



  • Hallo,

    1. den Kartenleser kenne ich leider nicht.
    2.
    Ich dachte so:

    if(data[cnt] >= 123) temp = data[cnt] + 0x4;
    

    Leider liegen die Umlaute alle bei 127 und höher, da zeigt er immer einen schwarzen Balken an. --> ???
    Wenn ich scheibe

    if(data[cnt] == "}") temp = "ü";
    

    ,
    dann geht es... ???

    Geht es auch einfacher? Ich will nicht den Halben ASCI-Code abtippen... 😞

    mfg
    trequ



  • Versuch mal:

    temp.Format("%c", data[cnt] + 0x4);
    


  • Leider keine Wirkung, ich poste mal den ganzen Code:

    void CTestDlg::ReadCard(CString data) 
    {	
    	CString temp, add;
    	int cntnl = 0;
    	for(int cnt = 0; cnt <= data.GetLength()-1; cnt++){
    		temp = "";
    		temp.Format("%c", data[cnt]);
    		if(data[cnt] >= 125) temp.Format("%c", data[cnt] + 0x4); 
    		if(data[cnt] < ' '){
    			cntnl++;
    			if(cntnl == 3) card.Krankenkasse_Name	= add;
    			if(cntnl == 5) card.Krankenkasse_Nr		= add;
    			if(cntnl == 7) card.Kartennr			= add;
    			if(cntnl == 9) card.Versicherten_Nr		= add;
    			if(cntnl == 11) card.Status				= add;
    			if(cntnl == 13) card.Status_Zusatz		= add;
    			if(cntnl == 15) card.Vorname			= add;
    			if(cntnl == 17) card.Nachname			= add;
    			if(cntnl == 19) card.Geb_Datum			= add;
    			if(cntnl == 21) card.Strasse			= add;
    			if(cntnl == 23) card.PLZ				= add;
    			if(cntnl == 25) card.Ort				= add;
    			if(cntnl == 27) card.gueltig_bis		= add;
    			add = "";
    		}
    		else{
    			add = add + temp;	
    		}
    	}
    }
    

    Es ist auch egal, ob es ein deutsches oder ein englishes VC++ ist.

    mfg
    trequ



  • Ich sehe da keinen Fehler. 😞



  • Was sagt der Compiler? 😕
    Debug mal und schau was in tmp steht.

    void CTestDlg::ReadCard(CString data)
    {   
        CString temp, add;
        int cntnl = 0;
        for(int cnt = 0; cnt <= data.GetLength()-1; cnt++){
            temp = "";
            temp.Format("%c", data[cnt]);
            if(data[cnt] >= 125) {
    breakpoint  temp.Format("%c", data[cnt] + 0x4);
            }
            if(data[cnt] < ' '){
                cntnl++;
                if(cntnl == 3) card.Krankenkasse_Name    = add;
                if(cntnl == 5) card.Krankenkasse_Nr        = add;
                if(cntnl == 7) card.Kartennr            = add;
                if(cntnl == 9) card.Versicherten_Nr        = add;
                if(cntnl == 11) card.Status                = add;
                if(cntnl == 13) card.Status_Zusatz        = add;
                if(cntnl == 15) card.Vorname            = add;
                if(cntnl == 17) card.Nachname            = add;
                if(cntnl == 19) card.Geb_Datum            = add;
                if(cntnl == 21) card.Strasse            = add;
                if(cntnl == 23) card.PLZ                = add;
                if(cntnl == 25) card.Ort                = add;
                if(cntnl == 27) card.gueltig_bis        = add;
                add = "";
            }
            else{
                add = add + temp;   
            }
        }
    }
    

    es reicht auch wenn du + 4 statt + 0x4 schreibt.



  • Ich werde gerade wahnsinnig.
    Das kann doch nicht sein...

    Seht euch bitte mal dieses Projekt an:

    http://www.pctex.de/test.zip

    Es gibt eigentlich für jeden ASCII wert zwischen 50 und 200 den Buchstaben aus.

    Ich habe da immer nur schwarze Kästchen ???

    mfg
    trequ


Anmelden zum Antworten