IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Kódování a PHP script

Aktivity
Avatar
Rosemary
Člen
Avatar
Rosemary:14.2.2015 10:04

Zdravím všechny, potřebovala bych poradit ohledně jedné věci s kódováním.
Mám .php soubor uložený v kódování UTF-8, v hlavičce HTML mám

<meta http-equiv="content-type" content="text/html" charset="utf8">

a potom mám input typu text. Když text odešlu a zpracuji přes _GET ve skriptu, vypíšu echem, tak je to okej. Písmenka mají čárky háčky :)

Ve skriptu pak zpracovávám text dál tak, že ho vypisuji různou barvou. Konkrétně jde o tuhle část kódu

$ret = '';
       //metoda pro výpočet přechodu
       $this->vypocetGradientu();
       // čítač
       $i=0;
       $textlength = strlen($this->text);
       while($i<$textlength)
       {
           foreach($this->GradientColors as $value)
           {

                   if ($this->text[$i] != "")
                   {
                       $ret .= '<span style="font-size:43px; color:#'.$value.';">'.$this->text[$i]."</span>";
                   }
                   $i++;

           }
       }
       echo ($ret);

A na výstupu mi echo dá otazníčky. Zkoušela jsem použít různě iconv, ut8_encode a tak různě, co jsem našla na netu. Ale nic mi nefungovalo, popř. se zobrazily jiné znaky, ale ne ty žádané.
Může mi někdo poradit, co s tím ? :-)
Děkuji

 
Odpovědět
14.2.2015 10:04
Avatar
Odpovídá na Rosemary
Michal Žůrek - misaz:14.2.2015 10:13

pravděpodobně kódování zdrojového kódu není UTF8. lepší IDE a editory to umí opravit.

 
Nahoru Odpovědět
14.2.2015 10:13
Avatar
Rosemary
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
Rosemary:14.2.2015 10:19

No to jsem myslím taky hledala a Notepad++ i PSPAD ukazují UTF-8 :)
jinak takto vypadají výstupy

  1. to je echo v konstruktoru, vypíše text, kterej se předal přes _GET a uložil do this->text
  2. to už je to echo co je tady v tom kódu
 
Nahoru Odpovědět
14.2.2015 10:19
Avatar
Odpovídá na Rosemary
Uživatel sítě :14.2.2015 10:32

Zkus to v PSPadu uložit znovu po zvolení formátu. Zvolíš formát, klikneš na UTF-8 a uložíš. Mě to takhle občas bugovalo, ve skutečnosti to kódování bylo jiné i když to ukazovalo UTF-8, asi nějaká chybka.

Nahoru Odpovědět
14.2.2015 10:32
Chybami se člověk učí, běžte se učit jinam!
Avatar
Rosemary
Člen
Avatar
Odpovídá na Uživatel sítě
Rosemary:14.2.2015 10:47

Díky, bohužel žádná změna :)

 
Nahoru Odpovědět
14.2.2015 10:47
Avatar
Odpovídá na Rosemary
Michal Šmahel:14.2.2015 12:33

A když zkusíš NetBeans??

Nahoru Odpovědět
14.2.2015 12:33
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
shaman
Člen
Avatar
Odpovídá na Rosemary
shaman:14.2.2015 13:09

Nemusi to byt problem s UTF-8. Vies nam dat viac informacii? Napriklad zdroj html kodu, ktory ti to vygenerovalo, nieco ako co som prilozil.

Z tvojho obrazku vidiet ze prvych sedem znakov ani nie je v <spane> pretoze nemaju nastavenu velkost fontu a farbu.

Takisto vies nam poslat co je v $this->text ? Skus pridat var_dump pred while cyklus.

$textlength = strlen($this->text);
var_dump($this->text);
while ($i < $textlength) {
Nahoru Odpovědět
14.2.2015 13:09
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Rosemary
Člen
Avatar
Odpovídá na shaman
Rosemary:14.2.2015 16:19

Máš pravdu, není to v tom o_O

$ret = '';
       $this->vypocetGradientu();
       // čítač
       $i=0;
       $textlength = strlen($this->text);
               var_dump($this->text);
       while($i<$textlength)
       {
           foreach($this->GradientColors as $value)
           {

                   if ($this->text[$i] != "")
                   {
                       $ret .= '<span style="font-size:43px; color:#'.$value.';">'.$this->text."</span>";
                   }
                   $i++;

           }
       }
       echo ($ret);

$ret .= '<span style="font-size:43px; color:#'.$valu­e.';">'.$this->text."</span>";
-> Když jsem nechala přidat pouze $this->text bez toho indexu [$i] vypisuje se to správně (akorát teda protože je to v cyklu, tak víckrát - celej text)

Podle mě to bude tím, že ty háčko-čárkové znaky zabírají 2 místa... ? A pak je bordel u toho indexu? No nevím.. 8|
Tady dávám obrázek co to udělá s var_dump.. a s kódem výše. (je tam vidět, že č zabírá 2 místa a s 1)

Jinak to html nevím co přesně myslíš :)

Každopádně alespoň už vím, že to není kódováním :D :D

 
Nahoru Odpovědět
14.2.2015 16:19
Avatar
d4rkw34v3r
Tvůrce
Avatar
d4rkw34v3r:14.2.2015 18:45

Pokud používáš UTF-8 jako kódování, tak nepoužívej funkci strlen, ale mb_strlen, protože české znaky v unicode zabírají 2 byty a ne jeden, proto ti dole ten var_dump ukazuje, že délka řetězce jsou 3, i kdžy to má ukazovat 2. Pokud chceš v tom tvem algoritmu změřit délku textu( počet znaků) a ne počet bytů, tak použij funkci mb_strlen, jak už jsem psal nahoře.

http://php.net/…b-strlen.php

Editováno 14.2.2015 18:46
 
Nahoru Odpovědět
14.2.2015 18:45
Avatar
shaman
Člen
Avatar
shaman:14.2.2015 19:01

:) Kodovanie mas spravne ale predsa je problem so spracovanim UTF-8 znakov.

Text "čs" ma 2 znaky ale zabera 3 bity. https://mothereff.in/byte-counter#…

Ak pozrieme http://php.net/strlen tak tam najdeme

Note:
strlen() returns the number of bytes rather than the number of characters in a string.

Tvoj cyklus ide preto tri razy. Ak chces naozaj pocitat znaky, tak v tvojom pripade by som pouzil

$textlength = iconv_strlen($this->text, mb_detect_encoding($this->text));

K bodu dva: tvoje $this->text[$i] by ti malo vratit jeden znak z tvojo textu. Ale kedze "č" zabera
dva znaky tak ti to takto nebude fungovat. Musis pouzit byte safe funkciu vo vnutri tvojho foreach loopu (http://php.net/…b-substr.php) Asi takto:

if (mb_substr($this->text(), $i, 1, mb_detect_encoding($this->text)) != "")
                   {
                       $ret .= '<span style="font-size:43px; color:#'.$value.';">'.mb_substr($this->text(), $i, 1, mb_detect_encoding($this->text))."</span>";
                   }
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
14.2.2015 19:01
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Rosemary
Člen
Avatar
Odpovídá na shaman
Rosemary:14.2.2015 19:12

Moc děkuji! :O Tohle funguje jak má! :P
btw: děkuji všem za odpovědi :)
Vyřešeno

 
Nahoru Odpovědět
14.2.2015 19:12
Avatar
Odpovídá na shaman
Michal Žůrek - misaz:14.2.2015 19:16

zabera 3 bity jsi asi chtěl napsqat jako zabera 3 bYty
bit a byte je rozdíl.
1 byte = 8 bitů.

 
Nahoru Odpovědět
14.2.2015 19:16
Avatar
shaman
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
shaman:14.2.2015 19:20

Spravne, to som chcel napsQat. Chybicka se vloudila ;)

Nahoru Odpovědět
14.2.2015 19:20
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.