Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Decodierung verschiedener Character Sets (https://www.delphipraxis.net/146840-decodierung-verschiedener-character-sets.html)

Garfield 27. Jan 2010 23:18


Decodierung verschiedener Character Sets
 
In Transport Streams sind Event Informationen (EPG) enthalten. Diese werden in verschiedenen Descriptoren angeben. Bei Texten gibt in der Regel das erste Char die Codierung des Textes an. Dazu gibt es in der ETSI EN 300 468 in Anhang A die Tabelle 3 (Seite 102):

Code:
First byte   Character code table                 Table description               Reproduced in
value                                                                               figure
0x01          ISO/IEC 8859-5 [27]                  Latin/Cyrillic alphabet         A.2
0x02          ISO/IEC 8859-6 [28]                  Latin/Arabic alphabet           A.3
0x03          ISO/IEC 8859-7 [29]                  Latin/Greek alphabet            A.4
0x04          ISO/IEC 8859-8 [30]                  Latin/Hebrew alphabet           A.5
0x05          ISO/IEC 8859-9 [31]                  Latin alphabet No. 5             A.6
0x06          ISO/IEC 8859-10 [32]                 Latin alphabet No. 6             A.7
0x07          ISO/IEC 8859-11 [33]                 Latin/Thai (draft only)         A.8
0x08          reserved for future use (see note)
0x09          ISO/IEC 8859-13 [34]                 Latin alphabet No. 7             A.9
0x0A         ISO/IEC 8859-14 [35]                 Latin alphabet No. 8 (Celtic)   A.10
0x0B         ISO/IEC 8859-15 [36]                 Latin alphabet No. 9             A.11
0x0C to 0x0F reserved for future use
0x10          ISO/IEC 8859                          See table A.4
0x11          ISO/IEC 10646 [16]                   Basic Multilingual Plane (BMP)
0x12          KSX1001-2004 [44]                    Korean Character Set
0x13          GB-2312-1980                          Simplified Chinese Character
0x14          Big5 subset of ISO/IEC 10646 [16]    Traditional Chinese
0x15          UTF-8 encoding of ISO/IEC 10646 [16] Basic Multilingual Plane (BMP)
0x16 to 0x1E reserved for future use
0x1F         Described by encoding_type_id        Described by 8 bit
                                                    encoding_type_id conveyed in
                                                    second byte of the string
In meinem deutschen Beispielstream wird die Codierung $05 verwendet. Da funktioniert die Decodierung anscheinend ohne Probleme. Einen Teil der anderen ISO 5589 Character Sets kann man vermutlich über die Delphi Fundamentals decodieren. Für die anderen müsste man wohl selbst CharMaps erstellen.

Kennt Ihr eine Alternative zu den Delphi Fundamentals, welche auch die anderen Character Sets unterstützt?

Wißt Ihr, warum bei den Unicode Character Sets die Codierung angegeben wird? Das sind doch bestimmt auch Doppelbytechar? Oder muss man ein Byte auf Grund der Codierung ergänzen?

Es wäre schön, wenn sich hier jemand damit auskennt und entsprechende Tipps geben kann.

Bernhard Geyer 28. Jan 2010 07:46

Re: Decodierung verschiedener Character Sets
 
Zitat:

Zitat von Garfield
Kennt Ihr eine Alternative zu den Delphi Fundamentals, welche auch die anderen Character Sets unterstützt?

http://philo.de/xml/downloads.shtml
Zitat:

Zitat von Garfield
Wißt Ihr, warum bei den Unicode Character Sets die Codierung angegeben wird?

Weil es protokolltechnisch schöner ist wenn solche Bytes immer vorhanden sind auch wenn hier bei Unicode-Text dies anders auch erkannt werden könnte.

Garfield 28. Jan 2010 14:33

Re: Decodierung verschiedener Character Sets
 
Sieht so aus, als hätte OpenXML alles, was ich brauche. Danke. :thumb:

himitsu 28. Jan 2010 14:38

Re: Decodierung verschiedener Character Sets
 
MSDN-Library durchsuchenMultiByteToWideChar und MSDN-Library durchsuchenWideCharToMultiByte
Falls die Listen der CharSets/CodePages nicht ausreichen ... in meiner himXML.pas existiert eine Tabelle, mit den passenden CodePages für diese Funktionen (einfach mal nach sowas wie "ISO-8859-5" suchen)

Du brauchst dann praktisch nur noch 'ne eigene Tabelle ala FirstByte(Byte)+CodePage(Word).

Garfield 28. Jan 2010 22:16

Re: Decodierung verschiedener Character Sets
 
Das werde ich mir auch ansehen.

Ich denke, wenn ich deutsche Sender nehme, würde es reichen, die Codes zu überspringen. Aber wenn es ordentlich sein soll, muss ich die Codes auswerten.

In WinSTB habe das gefunden:

Delphi-Quellcode:
var
    CyrTable: array [0..255] of char = (
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    ' ','!','"','#','$','%','&','''','(',')','*','+',',','-','.','/',
    '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
    '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
    'P','Q','R','S','T','U','V','W','X','Y','Z','[','\',']','^','_',
    '`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
    'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~',' ',
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    ' ','¨',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
    'À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï',
    'Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß',
    'à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï',
    'ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ',
    ' ','¸',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '
    );

    TrnTable: array[0..31] of pointer =
    ( nil, @CyrTable, nil, nil, nil, nil, nil, nil,
      nil, nil,      nil, nil, nil, nil, nil, nil,
      nil, nil,      nil, nil, nil, nil, nil, nil,
      nil, nil,      nil, nil, nil, nil, nil, nil );

    CharSets: array[0..31] of integer =
    (
      0, RUSSIAN_CHARSET, 0, 0, 0, TURKISH_CHARSET, 0, 0,
      0,              0, 0, 0, 0,              0, 0, 0,
      0,              0, 0, 0, 0,              0, 0, 0,
      0,              0, 0, 0, 0,              0, 0, 0 );

function DVBToWinStr(str:String;Length:Integer;CodePage:Integer):String;
var i:Integer;
    Transl: PChar;
begin
    CodePage:=TURKISH_CHARSET;
    Result:='';
    Transl:=nil;
    for i:=1 to Length do
    begin
      if Ord(str[i])=0 then break;

      if Ord(str[i])<$20 then
      begin
        Transl:=TrnTable[Ord(str[i])];
        CodePage:=CharSets[Ord(str[i])];
        continue;
      end;
      if (Ord(str[i]) {and $7F})>=$20 then
      begin
        if (Transl = nil) then
          result:=result+char(str[i])
        else
          result:=result+Transl[Ord(str[i])];
      end;
    end;
end;

Garfield 29. Jan 2010 12:27

Re: Decodierung verschiedener Character Sets
 
Die Unit CodecUtilsWin32 in Open XML basiert auf der Unit cUnicodeCodecs der Delphi Fundamentals.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz