Autor Zpráva
W4C
Profil
Nejsem sice zastáncem diakritických znamének na webu, ale tohle by se mi celkem hodilo nějak vyřešit.

Soubor je uložen v UTF-8, metatag je taky nastaven na UTF-8

Příklad:

$diakr="áčďéěíňóřšťúůýž";
echo $diakr; //tady je to ještě OK - UTF-8

for($i=0;$i < strlen($diakr);$i++) {
echo "[ ".$diakr[$i]." ] "; //[ | ] [ | ] [ | ] [ | ] [ | ] [ | ] [ | ] [ | ] ...... tady už je podle "mb_check_encoding" kódování ISO-8859-??
echo "[ ".ord($diakr[$i])." ] "; //[ 195 ] [ 161 ] [ 196 ] [ 141 ] [ 196 ] [ 143 ] [ 195 ] [ 169 ]....... ASCII hodnoty neodpovídají znakům v "$diakr"
}

před průchodem "FOR" je to v UTF-8, po průchodu v ISO-8859-1 (asi)

"iconv("ISO-8859-1", "utf-8",$charset[$i])" se nechytá...
Jak zajistím, aby po průchodu funkcemi, nebylo měněno kódování znaků v proměnných?
Všechno je bez vyjímky v UTF-8, proč se to tedy mění na jiné kódování?
Keeehi
Profil
UTF8 je multibytová znaková sada. Ke kódování znaků s diakritikou se používá 2 a více bytů. Funkce strlen vrací počet bytů řetězce, takže u multibytových kódování to nekoresponduje s reálným počtem znaků.

$diakr="áčďéěíňóřšťúůýž"; 
echo $diakr; //tady je to ještě OK - UTF-8

for ( $i = 0 ; $i < mb_strlen($diakr, 'UTF-8') ; $i++ ) { 
    echo "[" . mb_substr($diakr, $i, 1, 'UTF-8') . "]";
    echo "[ ".ord(mb_substr($diakr, $i, 1, 'UTF-8'))." ] "; // Toto by fungvat NEMĚLO, ord vrací hodnotu ASCII znaku.
}
W4C
Profil
Bohužel,výsledek je bez rozdílu stejný.
ORD má vracet Basic+Extended ASCII hodnoty znaků((dec)číslo[rozsah 0-255] podle nastaveného charsetu,což za běžných podmínek vrací správně(krom tohoto případu)

for ( $i = 0 ; $i < mb_strlen($diakr, 'UTF-8') ; $i++ ) //mb - tohle už funguje jak má

echo "[" . mb_substr($diakr, $i, 1) . "]"; //pokud je zde 1, je to stejné jako u mne[ | ], pokud 2 a více,střídají
se dvojznaky "||", "|čř|" u "4" apod
->
když nastavím počet na "1":
[ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ] [ � ]

když nastavím počet na "2" -končí to u "ó"
[ á ] [ �� ] [ č ] [ �� ] [ ď ] [ �� ] [ é ] [ �� ] [ ě ] [ �� ] [ í ] [ �� ] [ ň ] [ �� ] [ ó ]

když nastavím počet na "3" -končí to zas u "ó" a znaky se opakují atd
[ á� ] [ �č ] [ č� ] [ �ď ] [ ď� ] [ �é ] [ é� ] [ �ě ] [ ě� ] [ �í ] [ í� ] [ �ň ] [ ň� ] [ �ó ] [ ó� ]

ještě zkusím "iconv_set_encoding"

máš nějakej jinej nápad?
Keeehi
Profil
W4C:
Ještě jsem přidal UTF-8 do mb_substr.

To ord doopravdy nefunguje, místo toho se dá v dokumentaci v komentářích najít alternativa.
function uniord($u) { 
    $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8'); 
    $k1 = ord(substr($k, 0, 1)); 
    $k2 = ord(substr($k, 1, 1)); 
    return $k2 * 256 + $k1; 
} 
W4C
Profil
Výborně,už se diakritika předává v proměnné správně a uniord funguje.
Moc díky.

UNIORD:
Zde ale musí být ISO-8859-2,jinak to nefunguje
$k = mb_convert_encoding($u, 'ISO-8859-2, 'UTF-8');

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: