Autor Zpráva
Owery
Profil
Zdravím,

mám problém s kódováním u jednoduchého ajax scriptu. V souboru index.php mám v hlavičce:
<meta http-equiv="content-type" content="text/html; charset=utf-8">
potom mám kódování i v js nastavené:
<script src="js/jquery-1.7.2.js" type="text/javascript" charset="utf-8">
a i v samotném php scriptu který zpracovává script na pozadí:
<?php
header("Content-Type: text/html; charset=utf-8");
?>

Už si nevím rady.. Cílem mého scriptu je prohození věty, vypíše mi ji to pozpátku, ale mám problém s diakritikou a vypisují se mi neznáme znaky namísto háčků a čárek (PS: kódování daných souborů mám samozřejmě take UTF-8)

Kdyby mi někdo poradil jak s tím byl bych moc vděčný, já osobně si už s tím nevím více rady
Mike8748
Profil
Owery:
a neotáčíš ten text náhodou pomocí strrev ? otočení utf8 textu není tak snadné, znaky s diakritikou jsou přes jeden bajt, a tím že to po bajtech otočíš (právě pomocí strrev) tak utf8 text samozdřejmě rozbiješ
Owery
Profil
Mike8748: Otáčím text strašně složitě, jde jen o zkušební účel.. zde mám kód
<?php
header("Content-Type: text/html; charset=utf-8");
$text = $_POST['text'];
$delka = strlen($text);
$pole = chunk_split($text, "1", ".");
$pole = explode(".", $pole);
$citac = 0;
for($a = $delka-1; $a > -1; $a--){
    $final[$citac] = $pole[$a];
    $citac++;
    }
    echo(implode($final, ""));
?>
rozdělím žetězec do polí, a pak obráceným cyklem připojím prvky pole na "opačné" místo.. určitě by to šlo jednodušeji .. zkusim kouknout na lepší funkce
Mike8748
Profil
Owery:
ano, chunk_split tím rozděluješ ten text po 1 bajtu, a tím to rozbiješ.

zkusit můžeš např. tuto funkci (mam to z google, snad funguje dobře)
function UTF8Reverse($Input) {
  $Result='';
  $Characters=array();
  $IL=strlen($Input);
  for($i=0;$i<$IL;$i++) {
    // ref: http://en.wikipedia.org/wiki/UTF-8#Description
    // my implementation of the information provided in the Wikipedia link
    $B=array();
    for($j=0;$j<4;$j++)
      $B[$j]=($i+$j<$IL)?ord($Input{$i+$j}):0;
    if(($B[0]>>7)==0)
      $Characters[]=$B[0];
    if(($B[0]>>5)==6&&($B[1]>>6)==2)
      $Characters[]=($B[0]-192)*64+($B[1]-128);
    if(($B[0]>>4)==14&&($B[1]>>6)==2&&($B[2]>>6)==2)
      $Characters[]=($B[0]-224)*4096+($B[1]-128)*64+($B[2]-128);
  }

  $Characters=array_reverse($Characters); // this is the reversal part, this could be anything else you want

  foreach($Characters as $Char) {
    // ref: http://home.tiscali.nl/t876506/utf8tbl.html
    // bit masking, shifting, and bitwise OR done by me, har har
    if(($Char>>7)==0)
      $Result.=chr($Char);
    else if((($Char>>7)|15)==15||($Char>>11)==0)
      $Result.=chr(192+$Char/64).chr(128+$Char%64);
    else if((($Char>>11)|31)==31||($Char>>16)==0)
      $Result.=chr(224+$Char/4096).chr(128+$Char/64%64).chr(128+$Char%64);
  }
  return($Result);
} 

a v tvém skriptu bude akorát
header("Content-Type: text/html; charset=utf-8");
$text = $_POST['text'];
echo UTF8Reverse($text);
Owery
Profil
Už to funguje! Děkuji moc.. sám bych na to nepřišel .. nejspíš to nejde bez té funkce ani v jiných kódováních, zkoušel jsem ještě windows a taky to nešlo.. Jsem velkým dlužníkem :)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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