ANSIToOEM

Today I found some old source code. Someone wanted to write a file in the old OEM codepage. Therefore he wrote a small function that encapsulates the Windows API CharToOem function.

class function TStrUtil.ANSIToOEM(const ANSI: string): string;
var
  sBuffer: AnsiString;
begin
  if ANSI = '' then
    Exit('');

  SetLength(sBuffer, Length(ANSI));
  if CharToOem(PChar(ANSI), PAnsiChar(sBuffer)) then
    Result := string(sBuffer)
  else
    Result := ANSI;
end;

After that he added the OEM string to a TStringList and saved the TStringList to a file.

function TMyForm.SaveTheFile(const AFileName: string)
var
  pList: TStringList;
begin
  pList := TStringList.Create;
  try
    pList.Add(TStrUtils.ANSIToOEM('ÄÖÜ'));
    pList.SaveToFile(AFileName);
  finally
    pList.Free;
  end;
end;

I’m surprised that this code does work. Since Delphi 2010 strings are Unicode strings. This means that the OEM string is stored in a Unicode string variable.

Instead, I think is is much easier to use the wonderful TEncoding class.

function TMyForm.SaveTheFile(const AFileName: string)
var
  pList: TStringList;
  pOEMEncoding: TEncoding;
begin
  pOEMEncoding := nil;
  pList := TStringList.Create;
  try
    pOEMEncoding := TEncoding.GetEncoding(437);
    pList.Add('ÄÖÜ');
    pList.SaveToFile(AFileName, pOEMEncoding);
  finally
    pList.Free;
    pOEMEncoding.Free:
  end;
This entry was posted in Tips and Tricks and tagged . Bookmark the permalink.