PHP unpack() Anfänger

Shadow1701

Ensign
Registriert
Juli 2012
Beiträge
246
Guten Morgen,

ich versuche mich an der unpack() funktion. Etwas mit dem ich noch nie gearbeitet habe und es fällt mir schwer es zu verstehen.

ein 16 bit uimsbf habe ich entpackt.

jetzt lautet die Frage wie kann ich mit PHP 40bit bslbf entpacken? da komme ich nicht weiter.
Ergänzung ()

Hat sich erledigt, ich habe gerade herausgefunden das die Datei die ich öffnen möchte nicht dem beschriebenen Standard entspricht.

Ich verstehe die bitweise verarbeitung von Daten nicht.

Hast jemand Lust und Laune mir ein einfaches Script zu schreiben mit dem eine funktionierende EIT Datei erstellt werden kann?

die Grundlage ist Tabelle 7 in dieser PDF:
https://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.11.01_60/en_300468v011101p.pdf

Code:
for(i=0;i<N;i++){
event_id 16 uimsbf
start_time 40 bslbf
duration 24 uimsbf
running_status 3 uimsbf
free_CA_mode 1 bslbf
descriptors_loop_length 12 uimsbf
for(i=0;i<N;i++){
descriptor()
}
}
 
Zuletzt bearbeitet:
Shadow1701 schrieb:
Ich verstehe die bitweise verarbeitung von Daten nicht.

Was verstehst du daran nicht? Du hast einfach eine Folge von bits, welche alle Werte aneinandergereit sind.
Bei deinem Code da hättest du:
  • 16 bits (uint16) als event_id, gefolg von
  • 40 bits für start_time, wobei anscheinend die ersten 16 bits das Datum sind, gefolg von 3*8 bits für HH MM SS. Also uint16, uint8, uint8, uint8. Wie das codiert ist musst du selbst nachlesen, das mache ich jetzt sicher nicht. Das ist dann wiederum gefolgt von
  • 24 bits für die duration, was wieder 3*8 bits für HH MM SS sind, danach dann wohl
  • ein uint16, bei dem die ersten 3 der running_status sind, das 4. der free_CA_mode, und der rest dann die descriptor_loop_length. Hier musst du halt mit & (bitwise and) und der jeweiligen Maske arbeiten, für running_status und free_CA_mode noch bit shift verwenden.
Ich vermute mal sbf heißt dann big endian, ein pack format wäre dann vermutlich:
nnCCCCCCn
n = unsigned short (always 16 bit, big endian byte order)
C = unsigned char

Für unpack musst du das anscheinend bennenen, also:
nevent_id/nstart_date/Cstart_hour/...

Edit: Für Python hab ich hier was gefunden, was auf den ersten Blick genau das macht, und auch enthält wie Datum und Zeit gelesen werden: https://stackoverflow.com/questions/36128116/parsing-event-information-table-files

Aus der Funktion __readEitFile:
Python:
# Parse the data
                if data and 12 <= len(data):
                    # go through events
                    pos = 0
                    e = struct.unpack(">HHBBBBBBH", data[pos:pos+12])
                    event_id = e[0]
                    date     = parseMJD(e[1])                         # Y, M, D
                    time     = unBCD(e[2]), unBCD(e[3]), unBCD(e[4])  # HH, MM, SS
                    duration = unBCD(e[5]), unBCD(e[6]), unBCD(e[7])  # HH, MM, SS
                    running_status  = (e[8] & 0xe000) >> 13
                    free_CA_mode    = e[8] & 0x1000
                    descriptors_len = e[8] & 0x0fff

                    if running_status in [1,2]:
                        self.eit['when'] = "NEXT"
                    elif running_status in [3,4]:
                        self.eit['when'] = "NOW"

                    self.eit['startdate'] = date
                    self.eit['starttime'] = time
                    self.eit['duration'] = duration
 
Zuletzt bearbeitet:
Erst mal vielen Dank.

Hier mein test script, es soll eine Datei codieren und anschließend wieder auslesen. Die eventID funktioniert. Der Rest nicht. Warum?

writeeit.php
Code:
$bd[]=pack('n','3826'); //event_id
  $bd[]=pack('n','0xC079124500'); //93/10/13 12:45:00
  $bd[]=pack('C','0x014530'); //01:45:30
  $bd=implode('',$bd);
  if (file_exists('test.eit')) unlink('test.eit');
  $handle = fopen('test.eit',"w");
  fputs($handle,stripslashes($bd));
  fclose($handle);

readeit.php
Code:
$eit=implode('',file('test.eit')); 
  $array = unpack("neventid/ndate/Ctime", $eit);
  echo 'eventid: '.$array['eventid'];
  echo '<hr>';
  echo 'date: '.$array['date'];
  echo '<hr>';
  echo 'time: '.$array['time'];
  echo '<hr>';
 
1. Du übergibst ja auch Strings und keine Zahlen, das kann so nicht gehen.
PHP:
$a = "0x45"; // Der String 0x45
$b = 0x45; // Die Zahl 69 in Hexadezimalform


2. Du versuchst u.a. 40 bits in 16 bits (Format "n" = uint16) zu packen, das kann ja auch nicht gehen. Korrekt wäre, wie ich ja schon geschrieben habe, "nCCC".
coolmodi schrieb:
ein pack format wäre dann vermutlich:
nnCCCCCCn
Da brauchst du dann natürlich auch 4 Argumente statt einem. Also hex einfach aufteilen in 16, 8, 8, 8 bits.
PHP:
$bd[]=pack('nCCC', 0xC079, 0x12, 0x45, 0x00); // 93/10/13 12:45:00
// oder gleich komplett:
// event_id, 93/10/13, start 12:45:00, dur 01:45:30, running_status + free_CA_mode + descriptors_loop_length
$bd = pack('nnCCCCCCn', 3826, 0xC079, 0x12, 0x45, 0x00, 0x01, 0x45, 0x30, (3 << 13) + (1 << 12) + 0x1A0);

Das Entpacken geht ja analog dazu, nur halt right statt left shift und bitwise and mit Maske um ungewollte bits aus den letzten 16 bits vom "n" zu filtern, z.B. ($entpacktes_n & 0xE000) >> 13 für running_status.
 
Zuletzt bearbeitet:
Das entpacken von dem was du in der kompletten pack() geschrieben hast habe ich nicht hinbekommen. Zumindest kann ich das Ergebnis nicht als korrekt interpretieren (rscadln lassen wir hier mal außen vor).
Das hier:
Code:
$array = unpack("nEventID/nDate/CStart1/CStart2/CStart3/CDuration1/CDuration2/CDuration3/nrscadln", $eit);
gibt das hier aus:
Array ( [EventID] => 3826 [Date] => 49273 [Start1] => 18 [Start2] => 69 [Start3] => 0 [Duration1] => 1 [Duration2] => 69 [Duration3] => 48 [rscadln] => 29088 )

Die erstellte EIT datei kann ich auch mit keinem "Freeware EIT bearbeitungs Programm" öffnen. Was auch daran liegen kann dass die Datei noch nicht vollständig ist.

Seit Monaten habe ich ein PL beispiel gespeichert mit dessen Hilfe ich mich mal an den descriptor gewagt habe. Mit der Doku habe ich es natürlich nicht geschafft. Das folgende Beispiel weicht von der Dokumentation auch ab.

Code:
sub _getDescriptorBin {
    my $descriptor = shift;
    my $struct;

    if ( $descriptor->{descriptor_tag} == 0x4d ) {

        # short_event_descriptor
        my $descriptor_tag = 0x4d;
        my $descriptor_length;
        my $language_code   = _getByteString( $descriptor->{language_code} || 'slv');
        my $codepage_prefix = _getByteString( $descriptor->{codepage_prefix});
        my $raw_event_name  = $descriptor->{event_name}      || '';
        my $raw_text        = $descriptor->{text}            || '';
        
        my $codepage_prefix_length = length( $codepage_prefix );

        my $event_name = "";
        if ( $raw_event_name ne "") {
            $event_name = $codepage_prefix . substr( _getByteString($raw_event_name), 0, 255 - 5 - $codepage_prefix_length );
        }
        my $event_name_length = length( $event_name );

        my $text = "";
        if ( $raw_text ne "") {
            $text = $codepage_prefix . substr( _getByteString($raw_text), 0, 255 - 5 - $event_name_length - $codepage_prefix_length );
        }
        my $text_length = length( $text );

        $descriptor_length = $event_name_length + $text_length + 5;
        $struct            = pack( "CCa3Ca*Ca*",
            $descriptor_tag, $descriptor_length, $language_code,
            $event_name_length, $event_name, $text_length, $text );

    }
    elsif ( $descriptor->{descriptor_tag} == 0x55 ) {

        # parental_rating_descriptor
        my $descriptor_tag = 0x55;
        my $descriptor_length;

        my $substruct = '';
        foreach ( @{ $descriptor->{list} } ) {
            my $country_code = [I]getByteString( $[/I]->{country_code} || 'SVN');
            my $rating       = $_->{rating}       || 0;
            $substruct .= pack( "a3C", $country_code, $rating );
        }
        $descriptor_length = length($substruct);
        $struct = pack( "CCa*", $descriptor_tag, $descriptor_length, $substruct );
    }
    elsif ( $descriptor->{descriptor_tag} == 0x4e ) {

        # extended_event_descriptor
        $struct = _getExtendedEventDescriptorBin( $descriptor );
    }
    else {
        return "";
    }

    return $struct;
}

Hier wird unter anderem descriptor_number völlig ignoriert.

Abgesehen davon habe ich eine einzelne EIT Datei welche von enigma2 erzeugt wurde versucht auszulesen, was ich herausgefunden habe ist das diese Datei nicht dem in Tabelle 7 beschriebenen Standard entspricht. Was kann ich bezüglich der Grundlage von Tabelle 7 und Tabelle 51 jetzt weglassen und was muss ich beachten? Wirklich standardisiert ist das offenbar nicht.

Wie kann ich "fre" in 24-bit bslbf codieren damit das Ergebnis "0110 0110 0111 0010 0110 0101" lautet?
 
Shadow1701 schrieb:
Array ( [EventID] => 3826 [Date] => 49273 [Start1] => 18 [Start2] => 69 [Start3] => 0 [Duration1] => 1 [Duration2] => 69 [Duration3] => 48 [rscadln] => 29088 )
Sind doch genau die Zahlen, die do oben auch angegeben hast. Was soll da sonst rauskommen? Z.B. 0xC079 = 49273.

Shadow1701 schrieb:
Die erstellte EIT datei kann ich auch mit keinem "Freeware EIT bearbeitungs Programm" öffnen. Was auch daran liegen kann dass die Datei noch nicht vollständig ist.
Natürlich muss sie vollständig sein, und das da oben ist ja nur ein Teil.

Shadow1701 schrieb:
was ich herausgefunden habe ist das diese Datei nicht dem in Tabelle 7 beschriebenen Standard entspricht.
Kann das "Freeware EIT bearbeitungs Programm" sie öffnen? Oder wie hast du die ausgelesen?

Shadow1701 schrieb:
Wie kann ich "fre" in 24-bit bslbf codieren damit das Ergebnis "0110 0110 0111 0010 0110 0101" lautet?
Das sind einfach die 3 Buchstaben in Binärcode, 3 bytes halt. https://onlinetexttools.com/convert-binary-to-text?input=01100110 01110010 01100101
Ergänzung ()

So kurz Code von meinem Link in Post #2 für die MJD und BCD Funktion kopiert:
PHP:
<?php

function unBCD($byte)
{
    return ($byte >> 4) * 10 + ($byte & 0xf);
}

function parseMJD($ushort)
{
    $Y = intval( ($ushort - 15078.2) / 365.25 );
    $M = intval( ($ushort - 14956.1 - intval($Y * 365.25) ) / 30.6001 );
    $D  = $ushort - 14956 - intval($Y * 365.25) - intval($M * 30.6001);
    $K = 0;
    if ($M == 14 or $M == 15) $K = 1;

    return "" . (1900 + $Y + $K) . "/" .  ($M - 1 - $K * 12) . "/" . $D;
}

function PackTest()
{
    // event_id, 93/10/13, start 12:45:00, dur 01:45:30, running_status + free_CA_mode + descriptors_loop_length
    $bd = pack('nnCCCCCCn', 3826, 0xC079, 0x12, 0x45, 0x00, 0x01, 0x45, 0x30, (3 << 13) + (1 << 12) + 416);
    return $bd;
}

function ReadTest($eit)
{
    $array = unpack("nevent_id/nstart_date/Csh/Csm/Css/Csh2/Csm2/Css2/nrfd", $eit);
    echo 'eventid: '. $array['event_id'], PHP_EOL;
    echo 'date: ' . parseMJD($array['start_date']), PHP_EOL;
    echo 'hh: ' . unBCD($array['sh']), PHP_EOL;
    echo 'mm: ' . unBCD($array['sm']), PHP_EOL;
    echo 'ss: ' . unBCD($array['ss']), PHP_EOL;
    echo 'hh: ' . unBCD($array['sh2']), PHP_EOL;
    echo 'mm: ' . unBCD($array['sm2']), PHP_EOL;
    echo 'ss: ' . unBCD($array['ss2']), PHP_EOL;
    echo 'running_status: ' . (($array['rfd'] & 0xE000) >> 13), PHP_EOL;
    echo 'free_CA_mode: ' . (($array['rfd'] & 0x1000) >> 12), PHP_EOL;
    echo 'descriptors_loop_length: ' . ($array['rfd'] & 0x0fff), PHP_EOL;
}

echo "<pre>";
ReadTest(PackTest());
echo "</pre>";

Ausgabe:
Code:
eventid: 3826
date: 1993/10/13
hh: 12
mm: 45
ss: 0
hh: 1
mm: 45
ss: 30
running_status: 3
free_CA_mode: 1
descriptors_loop_length: 416

Beschäftige dich mal damit wie ein Computer Daten verarbeitet (Binär) und wie man damit im Code arbeiten kann. Wenn dir die Grundlage vollkommen fehlt wirst du hier immer wieder an den einfachsten Dingen hängen bleiben.
 
Zuletzt bearbeitet:
@coolmodi kannst du mir hier nochmal weiterhelfen?

die Funktion für den shorteventdescriptor sieht jetzt so aus:
PHP:
function getSED()
{
  //short_event_descriptor
  $prefix=0x15;
  $event_name=$prefix.substr('Event Name',0,250);
  $event_text=$prefix.substr('Text Event',0,250);
  $event_name_length=strlen($event_name);
  $event_text_length=strlen($event_text);
  $descriptor_length = $event_name_length+$event_text_length;
  $language_code=strigToBinary('deu'); //1100100 1100101 1110101
  $sed=pack( "CCCCCCCCC",0x4d, $descriptor_length,1100100,1100101,1110101,$event_name_length, $event_name, $text_length, $event_text );
  return $sed;
}

ich kann die datei mit edEIT öffnen. Es wird mir aber bei shorteventdescriptor nur die Sprache korrekt angezeigt.
Ich komme jedenfalls nicht mehr weiter
 
Ich hab keine Zeit und Lust mir die Spezifikationen genau anzusehen, daher dazu nicht viel. Aber dennoch sehe ich folgendes:

1.
PHP:
$prefix=0x15;
$event_name=$prefix.substr('Event Name',0,250);
$event_text=$prefix.substr('Text Event',0,250);
Soll hier wirklich die Zahl 21 als string davor stehen? Und substr('Event Name',0,250) Gibt dir in jedem Fall "Event Name" zurück, da es eh nicht 250 lang ist. Also $event_name wäre dann "21Event Name".

Die maximale Länge scheint ja 255 byte zu sein (descriptor_length ist 8 bit uint), daher müsstest du wenn dann beides zusammen auf 250 bytes limitieren, falls das der Plan war. Aber wie gesagt, Spezifikation nur ganz kurz angeschaut.

2.
Bis zur $event_name_length scheint das pack() zu passen, aber den $event_name und $event_text kannst du nicht als unsigned char (C) einfügen, da es ja strings sind. Es müsste mit "a" (NUL-padded string) und Wiederholung gehen. Weiterhin hast du da text_length statt event_text_length drin. Funktionieren sollte z.B.:
Code:
$sed=pack( "CCCCCCa{$event_name_length}Ca{$event_text_length}",0x4d, $descriptor_length,1100100,1100101,1110101,$event_name_length, $event_name, $event_text_length, $event_text );
Ergebnis:
811113


3.
descriptor_length soll wohl die Länge in bytes nach descriptor_length selbst sein. Das wäre dann nicht nur die Länge der beiden strings (was du gerade hast), sondern auch die 2 bytes für die Längenangaben, als auch die 3 bytes für den language code. Daher wohl auch die 250 von weiter oben.

Edit: Ah und
PHP:
$language_code=strigToBinary('deu'); //1100100 1100101 1110101
wird ja nicht mal verwendet, ist also völlig unnötig. Nicht (mehr) verwendeten Code am besten gleich auskommentieren, und falls gar nicht mehr benötigt direkt löschen.

Edit2: Man kann es nie genug sagen: Lernt Debuggen. Als Datei ausgeben und ein Hexeditor (siehe Bild, ist NP++ mit hexeditor plugin) zeigt dir dann sofort was in der Datei ist, und du hättest gesehen, dass deine strings gar nicht drin sind ;)

Und das mit text_length zeigt dir PHP ja selbst an. Falls du die Fehlerausgabe nicht aktiv hast, dann schalte sie an. Auf öffentlich zugänglichen Webservern bleibt die natürlich aus, aber in den logs tauchen die Fehler trotzdem auf.
 
Zuletzt bearbeitet:
@coolmodi dank dir habe ich jetzt ein script welches eine EIT Datei erstellt die aus header, short event descriptor und extended event descriptor besteht. Eine EIT Datei die sogar funktioniert, auch enigma2 kann das Ding lesen :cheerlead:

zu deinem post:
1. dieses Prefix soll laut Anhang A aussagen, dass das folgende mit UTF-8 Zeichensatz kodiert wird. Ich habe das Prefix entfernt. Funktioniert. edEIT zeigt mir jetzt keine Zeichencodierung an. Enigma2 scheint das nicht zu stören.

Ich habe event_name und event_text auf gemeinsam 250 Zeichen limitiert. Eine limitierung von 250 Zeichen pro event funktioniert definitiv nicht. enigma2 zeigt mir dann zwar beide events an, aber die extended description nicht mehr. Danke für den Hinweis. Keine Ahnung ob ich diese Einschränkung selbst herausgefunden hätte. Für mich zum Verständnis: warum ist das so?

2. Nochmals Danke. Der Hinweis hat es mir ermöglicht einen funktionierenden extended event descriptor zu erstellen

$language_code=strigToBinary('deu'); //1100100 1100101 1110101
Das gibt es noch weil mein script nur den versuch darstellt endlich etwas funktionierendes zustande zu bringen. Diese Zeile werde ich später noch brauchen, wenn ich das Ganze in eine aufgeräumte Funktion(en) verpackte.

jetzt versuche ich mich noch am parental rating descriptor. aber da bin ich zuversichtlich das ich das schaffe.
 
Shadow1701 schrieb:
Ich habe event_name und event_text auf gemeinsam 250 Zeichen limitiert. Eine limitierung von 250 Zeichen pro event funktioniert definitiv nicht. enigma2 zeigt mir dann zwar beide events an, aber die extended description nicht mehr. Danke für den Hinweis. Keine Ahnung ob ich diese Einschränkung selbst herausgefunden hätte. Für mich zum Verständnis: warum ist das so?
Ganz einfach, descriptor_length ist ja 8bit, und 8bit können nur 256 Zustände abbilden, also als unsigned int (uimsbf = unsigned int most significant bit first) die Zahlen 0-255. Dementsprechen sind 255 byte die maximale Länge die angegeben werden kann. Das "C" in pack() steht ja für unsigned char, und das ist praktisch equivalent zu einem unsinged int mit 8 bit.

Wenn du da jetzt als Eingabe z.B. 286 (1 0001 1111) hast, dann packt es da einfach nur 8 bits davon rein, und dann hast du 31 (0001 1111). Dann liest das Programm auch nur 31 bytes, und denkt alles danach gehört schon zu etwas anderem => alles folgende funktioniert nicht.

language_code braucht ja schon 3 byte, die 2 Längenangaben für event_name und event_text brauchen auch noch mal jeweils 1 byte, also bleiben noch 250 byte für event_name und event_text an sich.

Aber schön, dass es jetzt funktioniert.
Ergänzung ()

Shadow1701 schrieb:
1. dieses Prefix soll laut Anhang A aussagen, dass das folgende mit UTF-8 Zeichensatz kodiert wird. Ich habe das Prefix entfernt. Funktioniert. edEIT zeigt mir jetzt keine Zeichencodierung an. Enigma2 scheint das nicht zu stören.

Hab mir kurz Annex A angeschaut, und da geht es um das erste byte! Das muss für UTF-8 0x15 (21) sein. Falls das erste byte ein normales Zeichen ist (0x20 und höher) dann nimmt es einfach "Latin alphabet". Daher geht es auch ohne.

Was du gemacht hast ist aber $event_name = 0x15 . "Event Name";, und bei einer string concatenation (. in php) wird vorher alles in strings umgewandelt, und dann wird das zu "21Event Name".

Was du also willst ist 0x15 als byte, also einzelnes Zeichen, davor. Das geht dann z.B. so:
$event_name = chr(0x15) . "Event Name", was dann zu "Event Name" wird, mit einem nicht anzeigbarem Zeichen vor dem E.

811279
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Shadow1701
Guten Morgen @coolmodi

aktuelle sitze ich gerade an der Testfunktion zum Einlesen der EIT Dateien. Was EIT Dateien angeht welche von meinem Script erstellt wurden funktioniert das auch einwandfrei.
Bei EIT Dateien welche von enigma2 kommen sind die Ergebnisse unterschiedlich.
Zwei Fragen habe ich noch:

1) Beim Extended Descriptor ist die last_description_number oft über 100. Was bei der Länge des Textes kaum der Fall sein dürfte. Manchmal ist sie aber auch nur 1, was bedeutet, dass von der Extended Description nur die ersten 249 Zeichen angezeigt werden, der Rest fehlt dann. Die Frage ist jetzt ob ich die last_description_number überhaupt korrekt auslese.

Hier der auszug aus der Norm:
Code:
extended_event_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
descriptor_number 4 uimsbf
last_descriptor_number 4 uimsbf
ISO_639_language_code 24 bslbf
length_of_items 8 uimsbf
for ( i=0;i<N;i++){
item_description_length 8 uimsbf
for (j=0;j<N;j++){
item_description_char 8 uimsbf
}
item_length 8 uimsbf
for (j=0;j<N;j++){
item_char 8 uimsbf
}
}
text_length 8 uimsbf
for (i=0;i<N;i++){
text_char 8 uimsbf
}
}

meine pack() funktion:
PHP:
pack( "CCCCCCCCa{$text_length}",0x4e,$descriptor_length,$descriptor_number << 4 | $last_descriptor_number,1100100,1100101,1110101,$length_of_items,$text_length,$t);

die unpack() funktion welche bei enigma2 EIT Dateien beim Teil last_descriptor_number nicht wirklich funktioniert:
PHP:
$header="nevent_id/nstart_date/Csh/Csm/Css/Csh2/Csm2/Css2/nrfd/";
$thisunpack=$header."Csedtag/Csedel/Csedlc1/Csedlc2/Csedlc3/Csedenl/A{$sed[enl]}seden/Csedetl/A{$sed[etl]}sedet/Ceedtag/Ceeddl/Ceeddn/Ceedlc1/Ceedlc2/Ceedlc3/Ceedloi/Ceedtl/A{$eed[ett]}eedt";
...
    echo 'descriptor number: '.($array['eeddn'] >> 4).'<br>';
    $ldn=($array['eeddn'] & 0x00FF);
    echo 'last descriptor number: '.$ldn.'<br>';

2) bei der zweiten Frage geht es um schöneren Code.
beim Entpacken wird ein paarmal die Länge benötigt die einen Schritt davor entpackt wird.
Gelöst habe ich das testweise so:
PHP:
$header="nevent_id/nstart_date/Csh/Csm/Css/Csh2/Csm2/Css2/nrfd/";   
$array = unpack($header."Csedtag/Csedel/Csedlc1/Csedlc2/Csedlc3/Csedenl", $eit);
$sed['enl']=$array['sedenl'];
$array = unpack($header."Csedtag/Csedel/Csedlc1/Csedlc2/Csedlc3/Csedenl/A{$sed[enl]}seden/Csedetl", $eit);
Hier ist "sedenl" die Länge von "seden". Ich entpacke also einmal um die Länge herauszufinden, und entpacke dann ein zweites mal mithilfe der im ersten Durchgang herausgefundenen Länge.
Ich bin sicher es geht auch einfacher.
 
@coolmodi keine Antwort mehr? macht aber nichts, du hast mir mehr als genug geholfen. Ich werde das schaffen, langsam bekomme ich ein Gefühl für das Thema :)
 
Hatte kaum Zeit die letzten Tage. Falls du immer noch Hilfe brauchst schaue ich es mir bei Gelegenheit mal an.
 
Jetzt bin ich derjenige der kaum Zeit hat. Vielleicht gehts in ein paar Wochen weiter, dann gibts vielleicht noch gelgenheit dein Angebot anzunehmen. :)
 
Ich hole das Thema wieder aus der Versenkung. Auch wenn es diemal um was anderes geht.

Eit Dateien kann ich mittlerweile einwandfrei erstellen. Prinzipiell.

Mein neuestes Problem ist wieder einmal die Zeichenkodierung. Vor einem halben Jahr oder so habe ich meinen Rechner neu installiert. Dann habe ich auch eine neue mySQL Datenbank erstellt und die Sicherung importiert. Alle Felder aller Tabellen sind utf8_german2_ci. Alle PHP scripte sind als UTF8 gespeichert. Die Darstellung im Browser ist fehlerfrei.

Leider gibt es Fehler in den Eit Dateien was die Umlaute betrifft. Aber nicht überall. Ich habe jetzt 20 Episoden einer Serie. Bei der EIT Datei einer Episode werden die Umlaute nicht korrekt dargestellt. Bei der EIT Datei der nächsten Episode passen die Umlaute wieder. Wenn ich mir die Zeichencodierung der Strings welche korrekt und falsch angezeigt werden von PHP ausgeben lasse werden sie als ASCII angezeigt. Ich habe viele Felder: Titel Deutsch, Titel Original, Kurzbeschreibung, Ausführliche Beschreibung, Schauspieler, Regie, Drehbuch, Metadaten, usw.
Die meisten werden als ASCII, die wenigsten als UTF-8 angezeigt. Unterschiede in der in der Datenbank gespeicherten Texten einer funktionierenden und einer nicht funktionierenden EIT Datei konnte ich keine feststellen. Die Zeichencodierung unterscheidet sich nicht????

Leider ist es nicht möglich mir die Zeichencodierung auszugeben und dann entsprechend mit utf8_encode, iconv oder mb_convert_encoding zu arbeiten. Meine Versuche das per Script korrigieren zu lassen macht es nur noch schlimmer.

Ich benutze Windows10 und apache.

Die Zeichencodierung der erstellten EIT Dateien ist sehr selten UTF-8, meistens zeigt sie Notepad als ANSI an. Bei ANSI Dateien stimmen die Umlaute nicht.

Jetzt bin ich Testweise in die andere Richtung gegangen:
if (mb_detect_encoding($val)=='UTF-8') $row[$key]=utf8_decode($val);
also weg von UTF8, das Ergebnis ist eine EIT Datei die mir Notepad öfters, auch nicht immer, mit der Zeichencodierung UTF16 SE anzeigt. Notepad zeigt dann chinesische Schriftzeichen an, was natürlich nicht stimmt. Der Enigma2 Receiver allerdings ließt diese EIT Datei. Es werden die Umlaute korrekt dargestellt, was in diesem Beispiel nicht korrekt dargestellt wird sind die Anführungsstriche.

Hat jemand Tips für mich wie ich dieses Zeichencodierungsproblem für immer aus der Welt schaffen kann?
 
Zurück
Oben