Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Code Page-Name zu Identifier (https://www.delphipraxis.net/94951-code-page-name-zu-identifier.html)

xaromz 28. Jun 2007 14:55


Code Page-Name zu Identifier
 
Hallo,

gibt es eine Funktion, die mir zum Namen einer Code Page den zugehörigen Identifier liefert?

Also bei Eingabe von "ISO-8859-1" sollte dann "28591" rauskommen.
Siehe Code Page Identifiers

Ich könnte natürlich einfach die Liste in ein Array kloppen, aber solche Listen können sich ja ändern...

Gruß
xaromz

himitsu 17. Jan 2008 13:53

Re: Code Page-Name zu Identifier
 
hach, diese Code Page Identifiers hab'sch gesucht (ohne den genauen Namen sucht man sich im MSDN ja zu tode :wall: ), aber wenn sich das tatsächlich ändern kann, dann wär ich an einer Lösung auch interessiert :angel2:


Wär praktisch, wenn ich "zuverlässig" ISO-8859-1 bis ISO-8859-10 in Unicode umwandeln könnte.


nja ISO-8859-1 hab ich derzeit 1:1 übersetzt ... das scheint ja mit dem Unicode bis #255 übereinzustimmen

Bernhard Geyer 17. Jan 2008 13:55

Re: Code Page-Name zu Identifier
 
Zitat:

Zitat von himitsu
Wär praktisch, wenn ich "zuverlässig ISO-8859-1 bis ISO-8859-10 in Unicode umwandeln könnte.

Wie wäre es damit: Utility Library

himitsu 17. Jan 2008 14:08

Re: Code Page-Name zu Identifier
 
Dankö <(^_^<)



2 Minuten <-> 6,5 Monaten ... ich hoff mal der Threadersteller nimmt das nicht persölich :stupid:

xaromz 17. Jan 2008 14:45

Re: Code Page-Name zu Identifier
 
Hallo,
Zitat:

Zitat von himitsu
2 Minuten <-> 6,5 Monaten ... ich hoff mal der Threadersteller nimmt das nicht persölich :stupid:

nö, keine Spur. Ich hab' ja längst eine eigene Lösung.

Gruß
xaromz

himitsu 17. Jan 2008 15:18

Re: Code Page-Name zu Identifier
 
kannst sie ja auch gern noch verraten ... ma sehn was mir dann besser gefällt :angel:

xaromz 17. Jan 2008 16:15

Re: Code Page-Name zu Identifier
 
Hallo,
Zitat:

Zitat von himitsu
kannst sie ja auch gern noch verraten ... ma sehn was mir dann besser gefällt :angel:

bitte schön:
Delphi-Quellcode:
function ConvertText(const Text: AnsiString; Charset: Cardinal): WideString;
var
  CharsetInfo: TCharsetInfo;
  L: Integer;
begin
  // Codepage besorgen
  TranslateCharsetInfo(Charset, CharsetInfo, TCI_SRCCHARSET);

  // Puffergröße ermitteln
  L := MultiByteToWideChar(CharsetInfo.ciACP, MB_PRECOMPOSED,
    @Text[1], Length(Text), nil, 0);

  // Puffer anlegen
  SetLength(Result, L);

  // Konvertieren
  MultiByteToWideChar(CharsetInfo.ciACP, MB_PRECOMPOSED,
    @Text[1], Length(Text), @Result[1], L);
end;
Füll einen Text mit seinem Charset rein und Du bekommst das entsprechende Unicode.

Gruß
xaromz

Union 17. Jan 2008 17:25

Re: Code Page-Name zu Identifier
 
Zum Ermitteln der Codepage-Namen kannst Du das GetCPInfoEx verwenden. Wenn Du nach dem Namen suchst, kannst Du dies im Callback von EnumSystemCodePages machen.

himitsu 17. Jan 2008 17:56

Re: Code Page-Name zu Identifier
 
gut, ich hab eh nur die Namen wie "ISO-8859-1" als String und müßte dann die nachfolgenden Daten entsprechend konvertieren.
wobei diese CodePages zum Mindestumfang gehören was ich da unterstüzen müßte und wenn ich direkt über die Namen suchen könnte, dann würde ja automatisch noch anderes gleich mit unterstüzt :thumb:

also dann versuch ich's mal mit EnumSystemCodePages :)

Union 17. Jan 2008 18:02

Re: Code Page-Name zu Identifier
 
CPInfoEx ist in Delphi nicht definiert (jedenfalls in D7, 2007 habe ich schon wieder gelöscht). Hier ein Code den ich verwende um z.B. eine Combobox mit den Namen zu füllen. Besonderheit: Das Object-Property der Liste wird als Codepage missbraucht ;)
Delphi-Quellcode:
unit CpFuncs;

interface

uses windows, classes;

type
  _cpinfoex = record
    MaxCharSize: UINT;                      { max length (bytes) of a char }
    DefaultChar: array[0..MAX_DEFAULTCHAR - 1] of Byte; { default character }
    LeadByte: array[0..MAX_LEADBYTES - 1] of Byte;     { lead byte ranges }
    UnicodeDefaultChar : WCHAR;
    CodePage : UINT;
    CodePageName : array[0..MAX_PATH] of char;
  end;
  TCPInfoEx = _cpinfoex;
  {$EXTERNALSYM CPINFOEX}
  CPINFOEX = _cpinfoex;
  {$EXTERNALSYM GetCPInfoEx}

  procedure GetCodePageList(AList : TStrings);

  function GetCPInfoEx(CodePage: UINT; dwFlags : DWORD; var lpCPInfoEx: TCPInfoEx): BOOL; stdcall;
  function GetCPInfoEx; external kernel32 name 'GetCPInfoExA';

implementation

uses Sysutils;

var CodePageList : TStringList;

function CpEnumProc(CodePage : PChar) : Cardinal ; stdcall;
var
   CpInfoEx : TCPInfoEx;
   Cp : cardinal;
begin
  Cp := StrToIntDef(CodePage,0);
  if IsValidCodePage(Cp) then
  begin
     GetCPInfoEx(Cp, 0, CpInfoEx);
     CodePageList.AddObject(Format('%s', [CpInfoEx.CodePageName]), TObject(Cp));
  end;
  Result := 1;
end;

procedure GetCodePageList(AList : TStrings);
begin
   CodePageList.Clear;
   AList.Clear;
   EnumSystemCodePages(@CpEnumProc, CP_SUPPORTED);
   AList.Assign(CodePageList);
end;  

initialization
   CodePageList := TStringList.Create;

finalization
   CodePageList.Free;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz