LS,

In mijn simpele denkwijze is een php bestand niets anders dan een simpele text bestand.

Waarom maakt het dan uit of ik een bestand als ANSI of als UTF-8 opsla.
Vanwaar deze vraag.
Sinds de update van Rapid PHP2015 naar de 2016 versie werkte een script niet meer. Ik kreeg een foutmelding op regel 1 met (<?PHP) als tekst, natuurlijk zonder de ().

Na een middag zoeken en proberen en vergelijken met een werkend script zag ik onin de status bij wisseling van script in de editor ANSI veranderen in UTF-8

Nadat ik het script als ANSI bewarde werkte de boel.
Maar een tekst bestand is toch een plat-bestand??
Het maakt niet zozeer uit hoe je het bestand opslaat maar hoe je deze vervolgens serveert (meestal als een HTML-document waarin een charset gedefinieerd zou moeten zijn) en of er speciale karakters in zitten die de standaard ASCII reeks ontstijgen. Die karakters hebben verschillende encoderingen afhankelijk van hoe je e.e.a. opslaat.

Je huidige vraag is te algemeen. Geef een voorbeeld van code of een situatie waarin dit voor problemen zorgt.

Platte bestanden bestaan niet want There Ain't No Such Thing As Plain Text.
Harry geeft niet aan wat de foutmelding of het fenomeen was bij 'niet werken", maar eigenlijk kan ik maar 2 dingen bedenken.

1) ofwel staat er tekst in de file die plotseling "raar" uitziet.
<?php echo 'Eén tëxt öf ßo'; ?> waarbij de niet standaard letters plots verdubbelen tot 2 nog raardere tekens.

2) ofwel werken redirects, cookies of sessions niet meer door een headers-already-sent error, veroorzaakt door de BOM: het teken dat vooraan in een unicode file _kan_ staan om de Byte Order te Markeren.

Hoi Ivo,

Ik denk dat het dan optie 2 zal zijn want dat was de melding. Bijgaand het betreffende stuk script:

<?php
// ---------------------------------------------------------
// Vul hier een rapport specifiek clausule in.
// In dit rapport gaat het om welke combinaties hebben een onderkomen in de caravan nodig
$report = $_GET['report']; // report name/template
//$horseID = $_GET['horseFEIid']; // Horse FEI passport number/id
$sqlCombiWHERE = " AND 2010Combination.is_waitingList = 'No'" ;
$sqlCombiBASIC = "
    SELECT person.*, horse.*, 2010Combination.*, country.* , country.*
    FROM FEIPerson AS person
    JOIN 2010Combination ON person.fei_id = 2010Combination.personFEIid
    JOIN FEIHorse horse ON horse.fei_id = 2010Combination.horseFEIid
    JOIN country ON country.ISO_A3 = person.competing_for_country " ;
$sqlCombiORDER = "
    ORDER BY person.competing_for_country, person.family_name, 2010Combination.compNumber ASC " ; // not always neede, can do no harm
$sqlCombination = $sqlCombiBASIC . $sqlCombiWHERE . $sqlCombiORDER ;
if (!$Result = mysqli_query($dblink, $sqlCombination))
{
  $html = "There is een error opening table for " . $report . "; " . mysqli_error($dblink) . "<br />" ;
// for debug only
  $html .= "<br/>" ;
  $html .= $sqlCombiBASIC ;
  $html .= "<br/>" ;
  $html .= $sqlCombiWHERE ;
  $html .= "<br/>" ;
  $html .= $sqlCombiORDER ;
  $html .= "<br/>" ;
  $pdf->writeHTML($html, true, false, true, false, ' ') ;
}
else
{
  $numberCombination = mysqli_affected_rows($dblink) ; // must be at least 1
// ---------------------------------------------------------
  $pdf->setJPEGQuality(75) ; // set JPEG quality
  $pdf->SetFont('helvetica', '', 10) ; // set font
  $pdf->AddPage() ; // add a page
  $html = 'There is een error opening table for Financial Report; ' . mysqli_error($dblink) ;
  $numberCombination = mysqli_affected_rows($dblink) ;
//$Result
  if (!$result || ($numberCombination < 0))
  {
  }
  elseif ($numberCombination > 0)
  {
		for($i=0; $i<$numberCombination; $i++) {
            $Row = mysqli_fetch_assoc($Result);

            $countryFlag = 'images/Flags/'.$Row['e_country'].'.png';

            $pdf->SetFont('arialunicid0', '', 9);
            $pdf->SetFont('helvetica', '', 9);

            if($riderNF != $Row['competing_for_country']) {
//            $pdf->AddPage();

            $html = '<br /><br /><img border="0" src="'.$countryFlag.'" height="20">  <font size="+4"><b>'.$country_name.'</b></font> ('.$Row['competing_for_country'].')<br />
            <table cellspacing="0" cellpadding="0" border="0" width="100%">
            <tr>
            <th width="18"> </th>
            <th width="175">Rider</th>
            <!--th width="210">Horse</th--><!-- In 2015 vervallen -->
            <th width="75">Accomodation</th>
            <th width="50">Caravan</th>
            <th width="175">Groom</th>
            </tr>
            </table>';
            $pdf->writeHTMLCell(0, 0, '', '', $html, 'B', 1, 0, true, 'L', false);
            }

            $html = '<table cellspacing="0" cellpadding="0" border="0"  width="100%">
            <tr>
            <td width="25" align="center"> '.$Row[compNumber].'</td>
            <td width="175"> '.$Row['first_name'].' '.ucwords(strtolower($Row['family_name'])).'</td>
            <!--td width="210"> '.$Row['complete_name'].'</td--><!-- In 2015 vervallen -->';

            if($Row['stayHorseBox'] == 'Yes')
            { $html .= '<td width="75"  align="center"> Lorry </td>'; }
            else if($Row['appartmentBB'] == 'No')
            { $html .= '<td width="75"  align="center"> No </td>'; }
            else if($Row['appartmentNumber'] == 0)
            { $html .= '<td width="75" border="1" align="center">Bad Boekelo</td>'; }
            else
            { $html .= '<td width="75"  align="center">BB-'.$Row['appartmentNumber'].'</td>'; }

            if($Row['accomGroom'] == 'No')
            { $html .= '<td width="50"  align="center"> No </td>'; }
            else
            if($Row['caravanNumber'] == 0)
            { $html .= '<td width="50" border="1"></td>'; }
            else
            { $html .= '<td width="50" align="center"> '.$Row['caravanNumber'].' </td>'; }

            if($Row['genderGroom'] == 'Female') {$genderGroom = '(F)';} else { $genderGroom = '(M)'; }
            $html .= '<td width="175"> '.$Row['nameGroom'].' '.$genderGroom.' </td>
            </tr>
            </table>';
            $pdf->writeHTML($html, false, false, true, false, ' ');

            $riderNF = $Row['competing_for_country'];
}
  }
  else
  {
    $html = 'No records found.' ;
    $pdf->writeHTML($html, true, false, true, false, ' ') ;
  }
}
// ---------------------------------------------------------
//============================================================+
// END OF FILE
//============================================================+
?>

Elke respectabele editor heeft de mogelijkheid om op te slaan als UTF-8 zonder BOM (byte order mark). Dat zorgt voor de beste compatibiliteit.
De foutmelding zal iets zijn als

"Error Headers already sent on line 1 of /path/to/script.php ON line ... some other script."

De fout zit dan op regel 1 van script.php.

En als dan lijkt dat die regel begint met <¿php, dan zal er dus een onzichtbaar teken (BOM) staan vóór die <

LEES altijd de foutmelding, en met speciaal aandacht voor de regelnummers in de foutmeldingen.

Reageren