Autor | Zpráva | ||
---|---|---|---|
návštěvník Profil * |
#1 · Zasláno: 29. 12. 2013, 11:47:11
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 |
#2 · Zasláno: 29. 12. 2013, 12:15:55
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 * |
#3 · Zasláno: 29. 12. 2013, 12:53:53
Joker:
Nerozumím ti co chceš říct? Mě to vůbec nedává smysl. |
||
Davex Profil |
#4 · Zasláno: 29. 12. 2013, 13:26:49
návštěvník:
V tom prvním klíči je ještě před číslem nějaký neviditelný bordel. |
||
Joker Profil |
#5 · Zasláno: 29. 12. 2013, 13:30:54
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 |
#6 · Zasláno: 29. 12. 2013, 13:31:17
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 * |
#7 · Zasláno: 29. 12. 2013, 13:56:18 · Upravil/a: návštěvník
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 |
#8 · Zasláno: 29. 12. 2013, 18:32:23
Raději
"\xef\xff\xbf" |
||
návštěvník Profil * |
#9 · Zasláno: 30. 12. 2013, 08:55:59
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 |
#10 · Zasláno: 30. 12. 2013, 09:11:24
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 * |
#11 · Zasláno: 30. 12. 2013, 09:52:49 · Upravil/a: návštěvník
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' \xbf |
||
Jan Tvrdík Profil |
#12 · Zasláno: 30. 12. 2013, 10:38:16
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); } |
||
Časová prodleva: 10 let
|
0