Avatar
Rosemary
Člen
Avatar
Rosemary:

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):

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
Nesnáším {}, proto se jim vyhýbám.
Avatar
Rosemary
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Rosemary:

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
Marek Z.
Redaktor
Avatar
Odpovídá na Rosemary
Marek Z.:

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  +1 14.2.2015 10:32
Chybami se člověk učí, běžte se učit jinam!
Avatar
Rosemary
Člen
Avatar
Odpovídá na Marek Z.
Rosemary:

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

 
Nahoru Odpovědět 14.2.2015 10:47
Avatar
Nahoru Odpovědět  -2 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:

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  +1 14.2.2015 13:09
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Rosemary
Člen
Avatar
Odpovídá na shaman
Rosemary:

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
Člen
Avatar
d4rkw34v3r:

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  +1 14.2.2015 18:45
Avatar
shaman
Člen
Avatar
shaman:

:) 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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +2 14.2.2015 19:01
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Rosemary
Člen
Avatar
Odpovídá na shaman
Rosemary:

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

 
Nahoru Odpovědět  +1 14.2.2015 19:12
Avatar
Odpovídá na shaman
Michal Žůrek (misaz):

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  +1 14.2.2015 19:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
shaman
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
shaman:

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

Nahoru Odpovědět  -1 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.