Autor Zpráva
návštěvník
Profil *
Nevím si rady s tímto:

if (!isset($this->messages[
$originalNumbers[$n]])):
echo "<b>Index '".$originalNumbers[$n]."' not defined in this->messages</b><br>\n";
print_r($this->messages);
die();
endif;   

Výstup:
Index '5' not defined in this->messages
Array
(
    [5] => Chybně zadané datum narození
    [13] => Chybné ICQ
   .....
)

Chápete někdo proč dostávám hlášku, že index 5 není definovaný?
Joker
Profil
návštěvník:
Jestli je ten uvedený výstup přesný, tak si ten dotaz odpovídá sám. V poli není index 5, ale 5.
návštěvník
Profil *
Joker:
Nerozumím ti co chceš říct? Mě to vůbec nedává smysl.
Davex
Profil
návštěvník:
V tom prvním klíči je ještě před číslem nějaký neviditelný bordel.
Joker
Profil
návštěvník:
Aha, možná to není viditelné ve všech prohlížečích.
Není tam jen pětka, před ní je ještě znak 0xFEFF, což je BOM (informace o BOMu jsou i tady v PHP FAQ).

Asi se ty indexy vytvářejí z nějakého Unicode řetězce do kterého to co ho vytvořilo vložilo BOM a naopak to co ho zpracovává si s ním neumí poradit?
Chro
Profil
Já v [#1] vidím přes mobil čtvereček, tedy nepodporovaný znak a zřejmě navíc.
[tady:5] => Chybně zadané datum
návštěvník
Profil *
Bingo! Tady je způsob jakým vytvářím pole $this->messages

    foreach( file( self::input_id_database_file ) as $line ):
        list($id, $message) = explode(';', $line);
        # index: original number, value: new id and old message    
        $this->ids[$id] = $id; // new od
        $this->messages[$id] = rtrim($message); // old message            
    endforeach;

Takže funkce file() to způsobuje. Je to uložené v txt souboru unicode / utf8. Díky moc, na to bych sám nepřišel.


ještě dotaz: jak to odfiltrovat? Zdá se že trim nemá 0xFEFF mezi standardními znaky whitepace. Tedy co musím pro trim uvést jako argument charlist?


Zkoušel jsem toto:

    foreach( file( self::input_id_database_file ) as $line ):
        list($id, $message) = explode(';', $line);
        # index: original number, value: new id and old message    
        $this->ids[$id] = trim($id, '\xef\xff\xbf'); // new id ... make sure BOM is removed from first element on the left!
        echo "$id ".strlen($id)."; ".dechex(ord($id[0]))." ".dechex(ord($id[1]))." ".dechex(ord($id[2]));
        die();
        $this->messages[$id] = rtrim($message); // old message            
    endforeach;

A nefunguje. Výstup
5 4; ef bb bf
(hodnota čtvrtého znaku je 5), před nimi \xef , \xbb a \xbf
To je po pokusu to odtrimovat
Davex
Profil
Raději
"\xef\xff\xbf"
návštěvník
Profil *
Davex:
To jsem myslím taky zkoušel a nepomohlo to. Vyřešil jsem to takto:
if ( dechex(ord($id[0]))=="ef" )
    $id = substr($id,3); // trim nepomáhá

Mě ten trim totálně selhal. Což je taky důvod proč nechápu, jakto že jsem se ještě s tímto problémem u file a trim v životě nesetkal. Přitom funkci file a trim používám možná už od roku 2003.
Joker
Profil
návštěvník:
Mě ten trim totálně selhal. Což je taky důvod proč nechápu, jakto že jsem se ještě s tímto problémem u file a trim v životě nesetkal. Přitom funkci file a trim používám možná už od roku 2003.
Není to náhodou kvůli tomu, že v ukázce v [#7] se nepoužívá trim, ale rtrim, který ty znaky odstraní jen z konce řetězce?
návštěvník
Profil *
Joker:
To určitě ne. Ukázka s rtrim byla ze starého kódu. Zkoušel jsem ltrim a trim. Trim mi dokázal odstranit jen jeden znak z těch tří hexadecimálních sekvencí a myslím že to byl ten první znak zprava, který byl odfiltrovaný, zbytek zůstal.


$this->ids[$id] = trim($id, '\xef\xff\xbf'
První znak zprava v řetězci charlist:
\xbf
Jan Tvrdík
Profil
návštěvník:
Ty uvozovky musí být dvojité. V apostrofech escape sekvence nefungují. Navíc BOM pro UTF-8 je "\xEF\xBB\xBF", což je zřejmě důvod, proč ti to nefungovalo.

Navíc funkce trim obecně vůbec není vhodná funkce pro odstranění BOM, lépe je použít něco jako

if (substr($input, 0, 3) === "\xEF\xBB\xBF") { // BOM
    $input = substr($input, 3);
} 

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: