Delphi-PRAXiS

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.

himitsu 17. Jan 2008 18:54

Re: Code Page-Name zu Identifier
 
Zitat:

CPInfoEx ist in Delphi nicht definiert
hatte ich gemerkt und ein erster schneller Versuch mit EnumSystemCodePages liefert einfach immer nur eine einzige "10000" :shock:

Delphi-Quellcode:
Function EnumCodePagesProc(CodePageString: PChar): LongBool; StdCall;
  Begin
    Form1.Memo1.Lines.Add(CodePageString);
    Result := True;
  End;

Procedure TForm1.FormCreate(Sender: TObject);
  Begin
    EnumSystemCodePages(@EnumCodePagesProc, CP_SUPPORTED);
  End;
[Edit] hmm ... LongBool-True ($ffffffff) wird wohl nicht so bekocht wie LongWord(1)

Bollean-True(1) ist ja leider zu kurz :?

und dabei steht doch was von Boolean im PSDK :shock:



nur leider sind die CodePage-Namen etwas blöd ... nett lokalisiert, was ein prüfen auf bestimmte Namen ungünstig macht :cry:

Zitat:

21866 = "21866 (Ukrainisch - KOI8-U)"
28591 = "28591 (ISO 8859-1 Lateinisch I)"
28592 = "28592 (ISO 8859-2 Mitteleuropa)"
und "ISO 8859-1" <> "ISO-8859-1"

Union 17. Jan 2008 19:22

Re: Code Page-Name zu Identifier
 
Zitat:

Zitat von himitsu
Zitat:

CPInfoEx ist in Delphi nicht definiert
hatte ich gemerkt und ein erster schneller Versuch mit EnumSystemCodePages liefert einfach immer nur eine einzige "10000" :shock:

Das lag daran, dass ja die Funktion einen Pointer auf eine CPInofEx-Struktur empfängt ;)

himitsu 17. Jan 2008 19:55

Re: Code Page-Name zu Identifier
 
Zitat:

Zitat von Union
Zitat:

Zitat von himitsu
Zitat:

CPInfoEx ist in Delphi nicht definiert
hatte ich gemerkt und ein erster schneller Versuch mit EnumSystemCodePages liefert einfach immer nur eine einzige "10000" :shock:

Das lag daran, dass ja die Funktion einen Pointer auf eine CPInofEx-Struktur empfängt ;)

nee nee, LongBool (laut PSDK) auch in LongWord geändert und schon geht's.

bleibt aber dennoch das Problem mit der Stringerkennung.

also ich bekomm z.B. eine Datei und in der ist z.B. "ISO-8859-1" zu finden,
jetzt müßte ich das für eine Weitere Verarbeitung in Unicode umwandeln, da mein Programm damit arbeitet.

aber der String "ISO-8859-1" ist nirgends in de Liste zu finden :cry:

Union 17. Jan 2008 22:23

Re: Code Page-Name zu Identifier
 
Also mit dem oben geposteten Code geht es definitiv, ich mache im FormCreate folgendes:
Delphi-Quellcode:
GetCodePageList(cbxCpExt.Properties.Items);
Und das ist das Ergebnis:
http://softwareunion.lu/images/CodepageCombobox.png

himitsu 17. Jan 2008 22:42

Re: Code Page-Name zu Identifier
 
klar geht der Code ... hab ja nicht behauptet er ginge nicht, aber...

wenn dein Programm jetzt einen String ala "ISO-8859-1" bekommt, wie soll es diesen denn jetzt in dieser Liste suchen?

OK, ich könnte das erste "-" mal einfach so blind ersetzen, aber wer sagt mir daß dieses in einer anderen Sprache nicht wieder anders geschrieben wird?


Oder hab ich das jetzt nur falsch verstanden und bezieht sich dieses "könnte sich (zuküntig) ändern" nicht auf die Identifiers der CodePages und ich könnte diese somit doch hart kodieren?

('nen kleines Array der nötigen CPs ... CP-String_to_CP-Ident)

Union 18. Jan 2008 12:15

Re: Code Page-Name zu Identifier
 
Zitat:

Zitat von himitsu
wenn dein Programm jetzt einen String ala "ISO-8859-1" bekommt, wie soll es diesen denn jetzt in dieser Liste suchen?

Vielleicht mit Delphi-Referenz durchsuchenPos() ?

Muetze1 18. Jan 2008 12:20

Re: Code Page-Name zu Identifier
 
Zitat:

Zitat von Union
Vielleicht mit Delphi-Referenz durchsuchenPos() ?

Man beachte den roten Bindestrich in seinem Beispielstring...

Union 18. Jan 2008 12:45

Re: Code Page-Name zu Identifier
 
Ok, also geht es wohl um die Umsetzung eines html charset in eine Windows-Codepage. Da es dabei ja wirklich diese kleinen gemeinen Unterschiede in der Schreibweise bei html und Windows gibt muss man im schlimmsten Fall wohl tatsächlich eine feste Umsetzungstabelle verwenden. [edit]... oder auch diese[/edit]

himitsu 18. Jan 2008 16:47

Re: Code Page-Name zu Identifier
 
ok, dann halt doch hart kodiert ._.

nja, hoffentlich bleiben die Identifiers gleich ... klingt ja hier und da so, als könnte sich da mal was dran ändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 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 by Thomas Breitkreuz