Deutsche Umlaute von KVK
-
Hallo,
ich greife mit meinem Programm über eine CT-API DLL auf einen SmartCard Leser zu.
Ich kann eine KVK Karte lesen, jedoch werden deutsche Sonderzeichen nicht berücksichtigt.Aus "Jürgen" wird J}rgen, wobei die } den Hex-Wert 7D, also laut der ASCI-Tabelle den Wert für }.
Wie komme ich jetzt wieder zu den Umlauten?
Ich kann das doch bestimmt abfangen, wenn ich z.B. schreibe
if(name[i] == '}') name[i] = "ü";
passt es ja wieder.Aber wie finde ich raus, welche Werte ich ersetzten muss?
Es gibt ja auch noch das französiche é, usw... ???Gibt es eine Funktion, die sowas macht?
Danke im voraus.
mfg
trequ
-
Falls du mit KVK eine Versichertenkarte meinst - hast du mal ein paar Lesequellen für mich?
Ich muss das nämlich noch machen.Zu deinem Problem: Erstens solltest du eine switch nutzen (ist übersichtlicher).
Und zweitens: Gibt es vielleicht die Möglichkeit, dem Gerät zu sagen, welche Sprache / Schriftart du nutzen willst? Irgendwelche Konfigurationsmöglichkeiten?
-
Hallo,
estartu_de schrieb:
Falls du mit KVK eine Versichertenkarte meinst - hast du mal ein paar Lesequellen für mich?
Ich muss das nämlich noch machen.Was willst du machen?
1. Windows bietet für SmartCards die SCard Funktionen an. (Einfach in der MSDN nach SCard suchen)
2. SCM (alias Towitoko, Chipdrive) hat einige Beispiele: http://www.scmmicro.de/security/pcs_devtools.html
3. Für den Einsatz im medizinischen Bereich werden KV-zertifizierte SmartCard Leser vorausgesetzt. Diese werden (ich glaube immer / meistens ) über eine CT-API DLL angesteuert.
Eine CT-API DLL wandelt CT-API Befehle in PC/SC um, und gibt Sie weiter.
Ich verwende eine CT-API DLL. Allerdings hat jeder SmartCard Reader seine eigene DLL.estartu_de schrieb:
Zu deinem Problem: Erstens solltest du eine switch nutzen (ist übersichtlicher).
Und zweitens: Gibt es vielleicht die Möglichkeit, dem Gerät zu sagen, welche Sprache / Schriftart du nutzen willst? Irgendwelche Konfigurationsmöglichkeiten?((( Schriftart ??? )))
Also zur Sprache kann ich nichts sagen, ich lese es einfach Binär aus und mache dannCString out; for(cnt = 0; cnt <= daten_laenge; cnt++){ out.Format("%c" daten[cnt]); text = text + out; }
In Text steht dann das Ergebniss.
Vermutlich gehen dort die Umlaute verloren.
Ich kann es nicht anders auslesen, daher das Problem.
Ich muss die erhaltenen Infos wieder umwandeln.mfg
trequ
-
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 scheibeif(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:
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