Autor Zpráva
VixaFixa
Profil *
Zdravím, měl jsem problém, který jsem více méně vyřešil - s diakritikou, všechny soubory mám nastavené na UTF-8, taktéž meta tag - charset=utf-8, taktéž tabulky v databázi mám na utf8_general_ci.. - toto mi šlape, čtení z databáze mi ukazuje háčky a čárky v pohodě, díky tomuto

mysql_query("SET CHARACTER SET utf8") or die(mysql_error());

Ovšem problém je teď v tom, že když mám takové "SEO URL" např. mujweb.cz/vtipy/Blondýny ( Blondýnyje název vyčtený z databáze ) tak mi moje funkce pro konvertování url udělá toto - mujweb.cz/vtipy/blond-ny nebo Doktoři - dokto-i

funkce vypadá takto

function ConvertUrl( $text ) {
      $url = StrTr($text, "ÁÄČÇĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽáäčçďéěëíňóöřšťúůüýž?", "AACCDEEEINOORSTUUUYZaaccdeeeinoorstuuuyz");
      $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
      $url = trim($url, "-");
      $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
      $url = strtolower($url);
      $url = preg_replace('~[^-a-z0-9_]+~', '-', $url);
      return $url;
  }
Davex
Profil
Vyhoď to strtr(), protože s UTF-8 nebude pracovat správně. Převod na znaky bez diakritiky zajišťuje iconv().
TomasJ
Profil
Já bych znaky převedl např takto:
$arr = Array("Á"=>"A","Č"=>"C" atd...);
$url = $StrTr($text, $arr);
Po tomto už nebudou v textu znaky Á a Č ale místo toho to A a C.
Chro
Profil
Co se stane, když ve funkci strtr použiješ pouze převodní pole?
$preved = array(
'Á' => 'A',
'č' => 'c',
'...' => '...'
);
$url = strtr($url, $preved);
Např. znak Á má v UTF-8 dva bajty, znak A jen jeden. A s tím má funkce strtr při použití třech parametrů problém.
jenikkozak
Profil
Další možnost do sbírky nápadů: Použití funkce urlencode.
Medvídek
Profil
VixaFixa:
Když už kopíruješ skripty bez copyrightu
/** Vytvoření přátelského URL
* @param string řetězec v kódování UTF-8, ze kterého se má vytvořit URL
* @return string řetězec obsahující pouze čísla, znaky bez diakritiky, podtržítko a pomlčku
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
tak si aspoň přečti, za jakých podmínek skript funguje:
Pro spolehlivou funkčnost je potřeba nastavit proměnnou LC_CTYPE funkcí setlocale na kódování UTF-8, např. tedy cs_CZ.utf-8.
VixaFixa
Profil *
Tedy mám to takto,

/** Vytvoření přátelského URL
* @param string řetězec v kódování UTF-8, ze kterého se má vytvořit URL
* @return string řetězec obsahující pouze čísla, znaky bez diakritiky, podtržítko a pomlčku
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
  public function ConvertUrl( $text ) {
    
    setlocale(LC_CTYPE , "cs_CZ.utf-8");
    $url = $text;
    $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
    $url = trim($url, "-");
    $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
    $url = strtolower($url);
    $url = preg_replace('~[^-a-z0-9_]+~', '', $url);
    return $url;
  }

Ale místo toho, aby mi to přejmenovalo ten znak z Ř na R, tak mi ho prostě vynechá, např. doktoři mi dá doktoi
Zkoušel jsem i to s tím polem v strtr a nepomohlo..
Davex
Profil
VixaFixa:
Nezkoušíš to na nějakém zahraničním webhostingu, kde není nainstalované české locales? Jinak by to mělo být správně bez pomlčky "cs_CZ.utf8" (ale většinou to funguje i s ní).
peta
Profil
Jeste tu mam reseni (skryte v html kodu http://peter-mlich.wz.cz/web/js/prx/diakritika.htm), pokud ti nefunguje tip od Chro.
$utf8table = array ("\xc3\xa1"=>"a",
"\xc3\xa4"=>"a",
"\xc4\x8d"=>"c",
"\xc4\x8f"=>"d",
"\xc3\xa9"=>"e",
"\xc4\x9b"=>"e",
"\xc3\xad"=>"i",
"\xc4\xbe"=>"l",
"\xc4\xba"=>"l",
"\xc5\x88"=>"n",
"\xc3\xb3"=>"o",
"\xc3\xb6"=>"o",
"\xc5\x91"=>"o",
"\xc3\xb4"=>"o",
"\xc5\x99"=>"r",
"\xc5\x95"=>"r",
"\xc5\xa1"=>"s",
"\xc5\xa5"=>"t",
"\xc3\xba"=>"u",
"\xc5\xaf"=>"u",
"\xc3\xbc"=>"u",
"\xc5\xb1"=>"u",
"\xc3\xbd"=>"y",
"\xc5\xbe"=>"z",
"\xc3\x81"=>"A",
"\xc3\x84"=>"A",
"\xc4\x8c"=>"C",
"\xc4\x8e"=>"D",
"\xc3\x89"=>"E",
"\xc4\x9a"=>"E",
"\xc3\x8d"=>"I",
"\xc4\xbd"=>"L",
"\xc4\xb9"=>"L",
"\xc5\x87"=>"N",
"\xc3\x93"=>"O",
"\xc3\x96"=>"O",
"\xc5\x90"=>"O",
"\xc3\x94"=>"O",
"\xc5\x98"=>"R",
"\xc5\x94"=>"R",
"\xc5\xa0"=>"S",
"\xc5\xa4"=>"T",
"\xc3\x9a"=>"U",
"\xc5\xae"=>"U",
"\xc3\x9c"=>"U",
"\xc5\xb0"=>"U",
"\xc3\x9d"=>"Y",
"\xc5\xbd"=>"Z");
$text =  strtr($text, $utf8table);

$utf8table = array (
'Á'=>'A',
'Ä'=>'A',
'Č'=>'C',
'Ç'=>'C',
'Ď'=>'D',
'É'=>'E',
'Ě'=>'E',
'Ë'=>'E',
'Í'=>'I',
'Ň'=>'N',
'Ó'=>'O',
'Ö'=>'O',
'Ř'=>'R',
'Š'=>'S',
'Ť'=>'T',
'Ú'=>'U',
'Ů'=>'U',
'Ü'=>'U',
'Ý'=>'Y',
'Ž'=>'Z',
'á'=>'a',
'ä'=>'a',
'č'=>'c',
'ç'=>'c',
'ď'=>'d',
'é'=>'e',
'ě'=>'e',
'ë'=>'e',
'í'=>'i',
'ň'=>'n',
'ó'=>'o',
'ö'=>'o',
'ř'=>'r',
'š'=>'s',
'ť'=>'t',
'ú'=>'u',
'ů'=>'u',
'ü'=>'u',
'ý'=>'y',
'ž'=>'z'
);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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