Autor | Zpráva | ||
---|---|---|---|
TomasJ Profil |
Zdravím, udělal jsem si vlastní třídu na zakódování nějakého textu. Vše mi fungovalo, používal jsem funkci
str_rot13 . Ta ovšem podporuje jen a-z A-Z, takže jsem se rozhodl napsat vlastní metodu. V JavaScriptu mi fungovala bezvadně, tak jsem se rozhodl ji převést do PHP. Jenže PHP mi vypisuje poznámky Uninitialized string offset . Nevíte někdo co mám špatně? Dám vám sem část, ve které nejspíš je chyba.
private $ed; private $chr; public function __construct(){ $this->ed = false; $this->chr = '0123456789ABCDEFGHIJKLMNOQRSTUVWXYZ.,:!?=%/()[]{}+-*abcdefghijklmnopqrstuvwxyz$_&~^"\'°<>§;ĚËŠČŘŽÝÁÄÍÉÖÓÔÜÚŮĎŤŇ ěëščřžýáäíéöóôüúůďťň#@\\´|'; } //Tady asi bude někde chyba private function rot($str){ $out = ""; for($i=0;$i<strlen($str);$i++){ if(stripos($this->chr,$str[$i])>-1){ for($a=0;$a<strlen($this->chr);$i++){ if(isset($this->chr[$a]) && $str[$i]==$this->chr[$a]){ //30. řádek $p = strlen($this->chr)/2; if($a+$p+1>$p*2) $out.=$this->chr[$p-($p*2-$a)]; else $out.=$this->chr[$a+$p]; } } } else $out.=$str[$i]; } return $out; } Po 30. sekundách se přestanou poznámky vypisovat a skript skončí z důvodu překročení limitu. Jo málem bych zapomněl, "chyba" je na 30. řádku (označeno v kódu) - k tomuto řádku se poznámky píší. |
||
Tori Profil |
#2 · Zasláno: 9. 3. 2012, 17:14:52
TomasJ:
JavaScript podporuje utf8. PHP ne, strlen počítá bajty (nikoli znaky). Nevím, jaký znak to vrátí v případě, že zápisem $string[3] požadujete část vícebajtového znaku, v tom asi bude problém. Zkuste místo řetězce použít pole znaků (strlen -> count, atd.). |
||
Keeehi Profil |
Tori:
PHP zvládá utf-8. Já osobně jiné kódování než utf-8 nepoužívám. Ale ano, strlen nefunguje správně s multibytovými kódováními. Proto jsou v PHP funkce na práci s nimi. K strlen je ekvivalentní mb_strlen. |
||
TomasJ Profil |
#4 · Zasláno: 9. 3. 2012, 18:02:03
Keeehi:
No, počítám, že prohození strlen za mb_strlen asi nestačí, že? Mohl by jsi mi poradit prosím? Fakt mě nenapadá jak to vyřešit. Snad mb_convert_encoding ?
|
||
Časová prodleva: 12 let
|
0