AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringkonvertierung

Ein Thema von HPB · begonnen am 4. Jul 2014 · letzter Beitrag vom 6. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#1

AW: Stringkonvertierung

  Alt 4. Jul 2014, 09:01
Delphi-Quellcode:
const
  Test = 'Achtung Farb„nderung';
var
  s: string;
begin
  SetLength(s, Length(Test));
  OEMToCharBuff(PAnsiChar(Test), PChar(s), Length(Test));
  ShowMessage(s);
end;
Sah gut aus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#2

AW: Stringkonvertierung

  Alt 4. Jul 2014, 09:10
Delphi-Quellcode:
const
  Test = 'Achtung Farb„nderung';
var
  s: string;
begin
  SetLength(s, Length(Test));
  OEMToCharBuff(PAnsiChar(Test), PChar(s), Length(Test));
  ShowMessage(s);
end;
Sah gut aus.
Habe ich gerade ausprobiert. Die Umlaute sind nicht vorhanden.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#3

AW: Stringkonvertierung

  Alt 4. Jul 2014, 09:12
Komisch, bei mir schon.

[edit] @Blup: Lies mal die Bemerkungen zu OEMToChar/CharToOEM, Dein Code wird unter Delphi > 2007 knallen. Außerdem rät Microsoft selbst von der Verwendung ab.[/edit]
[edit2] Sry, ich hab übersehen, dass Du alles als AnsiStrings deklariert hast. Damit bleibt nur noch Punkt 2. [/edit2]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH ( 4. Jul 2014 um 09:19 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Stringkonvertierung

  Alt 4. Jul 2014, 09:20
Vllt. was zur Codierung, könnte helfen:

Zitat:
Die DATANORM-Schnittstelle ist auf eine minimale Hardware-Konfiguration zugeschnitten und erlaubt somit den weitreichenden Einsatz. Alle Datensätze bestehen aus reinem ASCII-Text, wobei jeder Satz exakt 128 Zeichen lang und durch eine Zeichenschaltung (Carriage return/0DH 0AH) abgeschlossen ist.

Der erlaubte Zeichenvorrat lehnt sich an den IBM-Zeichensatz an, wobei jedoch nur die unteren 128 Zeichen erlaubt sind. Lediglich die deutschen Sonderzeichen bilden hier eine Ausnahme und tragen weiterhin die Positionscodes des erweiterten ASCII-Zeichensatzes.
Quelle:
http://www.textarchiv.alojado.de/tex...en-ap1387.html
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Stringkonvertierung

  Alt 4. Jul 2014, 10:30
Nun wenn Du die Daten nicht mehr zurück liefern mußt, dann laß doch gleich alles durch eine Übersetzungstabelle laufen:
Delphi-Quellcode:
for i:=1 to length(mystring) do
  mystring[i]:=asciitab[mystring[i]];
Die kannst Du anpassen wie Du es gerne hättest.
(diesen OEmtoAnsi's traue ich nur so weit wie ich sie selbst geschrieben habe)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: Stringkonvertierung

  Alt 4. Jul 2014, 10:15
Dann stimmt vermutlich die im Windows eingestellte OEM-Code-Page nicht.
Stell mal in den Ländereinstellungen auf Englisch(USA) und speichern.
Danach wieder auf Deutschland(Deutsch), speichern und Windows neu starten.

Zitat:
[edit] @Blup: Lies mal die Bemerkungen zu OEMToChar/CharToOEM, Dein Code wird unter Delphi > 2007 knallen. Außerdem rät Microsoft selbst von der Verwendung ab.[/edit]
Zitat:
Security Considerations

Using this function incorrectly can compromise the security of your application.
Ich hab nicht vor diese Funktion inkorrekt zu benutzen. Deshalb auch schön in eigene Funktionen gekapselt die mit AnsiString und PAnsiChar arbeiten.
Das sollte auch nach Delphi 2007 keine Probleme verursachen.

In neueren Delphi-Versionen könnte man auch das mal versuchen, kann ich aber grad nicht testen:
Delphi-Quellcode:
function ConvertCodePage(const S: _RawByteStr; AFromCodePage, AToCodepage: Word): _RawByteStr;
begin
  Result := S;
  SetCodePage(Result, AFromCodePage, False); // Codepage der Ausgangsdaten nur festlegen
  SetCodePage(Result, AToCodepage, True); // Codepage umstellen und Daten konvertieren
end;

sl.Text := ConvertCodePage(sl.Text, 437, 850);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#7

AW: Stringkonvertierung

  Alt 4. Jul 2014, 10:27
Ich hatte ja noch einmal editiert. Trotzdem: wenn der Hersteller schon schreibt
Zitat:
Warning Do not use.
dann nehme ich das ernst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#8

AW: Stringkonvertierung

  Alt 4. Jul 2014, 10:42
Zitat:
Security Considerations

Using this function incorrectly can compromise the security of your application.
Ich hab nicht vor diese Funktion inkorrekt zu benutzen.
Nach genauerer Betrachtung tust Du das aber. Die Deklaration als AnsiString/PAnsiChar bewirkt ja nicht, dass da nun CharToOEMA/OEMToCharA aufgerufen wird, das muss man schon explizit tun. Deshalb gilt
Zitat:
If the OemToChar function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if OemToChar is being used as a wide-character function.
auch weiterhin, zumindest ab Delphi 2009.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#9

AW: Stringkonvertierung

  Alt 4. Jul 2014, 16:04
Nach genauerer Betrachtung tust Du das aber. Die Deklaration als AnsiString/PAnsiChar bewirkt ja nicht, dass da nun CharToOEMA/OEMToCharA aufgerufen wird, das muss man schon explizit tun. Deshalb gilt
Zitat:
If the OemToChar function is being used as an ANSI function, the string can be translated in place by setting the lpszDst parameter to the same address as the lpszSrc parameter. This cannot be done if OemToChar is being used as a wide-character function.
auch weiterhin, zumindest ab Delphi 2009.
Wenn ich das richtig verstehe ruft die Funktion OemToChar
bis Delphi 2007 -> OemToCharA
ab Delphi 2009 -> OemToCharW auf.
Ok, dann häng ich da gleich noch ein A dran...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#10

AW: Stringkonvertierung

  Alt 4. Jul 2014, 17:01
Eigentlich sollte OemToCharA ja OemCP_to_AnsiCP heißen, womit dann auch klarer wird, warum da keiner an Unicode gedacht hat.
Außerden ist OEM nunmal eine ANSI-CodePage und hat damit auch garnichts in einem UnicodeString zu suchen.
Also wenn, dann sollte man es doch besser richtig machen, also via MultiByteToWideChar von CP_OEMCP nach Unicode.

Und warum MS von dessen Verwendung abrät, liegt daran, daß viele es verwenden, um InSpace die einzelnen "SingleByte"-Zeichen der OEM-CP in die Ansi-CP umzuwandeln.
Da aber je nach Ansi-CP das eben auch mal eine MultyByte-CodePage sein kann und fast kein Schwein das beachtet, gibt es da ein Problem mit der Puffergröße und es endet zu oft in einem Buffer-Overflow.
z.B. Deutsch und Englisch sind ja SingleByte ... drum merken es viele Programmierer garnicht, daß sie totalen Mist verzapft haben.
So sind also auch alle hier gezeigten Lösungsvorschläge nicht unbedingt "sicher" oder zumindestens funktionieren nicht immer richtig (siehe #12).

Darum ist das Dateisystem nun eben auch immer englisch und wird lokalisiert, genausio wie das Systemlaufwerk auch fast immer nur noch C: ist, da zuviele Idioten mit hardgecodeten Pfaden arbeiten.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Jul 2014 um 17:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz