Thema: Delphi Console: OEM nach ANSI

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Console: OEM nach ANSI

  Alt 13. Jun 2010, 19:22
Du könntest statt dem CharToOem einfach mal SetFileApisToOEM versuchen.

> MSDN-Library durchsuchenSetFileApisToOEM, MSDN-Library durchsuchenSetFileApisToANSI und MSDN-Library durchsuchenAreFileApisANSI



Meckert dein Delphi 2009+ eigentlich nicht über den Ansi-Unicode-Mischmasch?

Für AnsiString mußt du OemToCharA verwenden.
Delphi-Quellcode:
function OEM2Ansi(const OEMString: AnsiString): AnsiString;
begin
  Result := OEMString;
  if Result <> 'then
    OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
end;
oder mal so versuchen:
Delphi-Quellcode:
function OEM2Ansi(const OEMString: AnsiString): AnsiString;
begin
  Result := OEMString;
  if Result = 'then Exit;
  OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
  PWord(Integer(Result) - 12)^ := 0;
end;


PS
Delphi-Quellcode:
type
  PStrRec = ^StrRec;
  StrRec = packed record
    codePage: Word;
    elemSize: Word;
    refCnt: Longint;
    length: Longint;
  end;
  OEMString = type AnsiString(CP_OEMCP);

procedure TForm5.FormCreate(Sender: TObject);
var A: AnsiString;
begin
  A := UTF8Encode('äöü');
  ShowMessage(A);
  {$IF CompilerVersion >= 20.0}
    if A <> 'then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_NONE;
    ShowMessage(A);
  {$IFEND}

  A := 'äöü';
  UniqueString(A); // Konstante in Variable umwandeln
  CharToOemA(PAnsiChar(A), PAnsiChar(A));
  {$IF CompilerVersion >= 20.0}
  //if A <> '' then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_NONE;
    ShowMessage(A);
    if A <> 'then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_OEMCP;
  {$IFEND}
  ShowMessage(A);
end;
Delphi-Quellcode:
var S: AnsiString;

SetString(S, P, BytesRead); // von PAnsiChar
//SetString(S, @Buf[0], BytesRead); // von AnsiChar-Array
if S <> 'then PWord(Integer(S) - 12)^ := CP_OEMCP;
// und schon wandelt Delphi automatisch die Codepage um

ShowMessage(A);
Delphi-Quellcode:
var S: AnsiString;

SetString(S, P, BytesRead); // von PAnsiChar
//SetString(S, @Buf[0], BytesRead); // von AnsiChar-Array
if S <> 'then PWord(Integer(S) - 12)^ := CP_OEMCP;

ShowMessage(A);
und schon wandelt Delphi automatisch die Codepage um, wenn dieser AnsiString z.B. an einen String/UnicodeString übergeben wird.
(also ab Delphi 2009)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat