Autor | Zpráva | ||
---|---|---|---|
W4C Profil |
#1 · Zasláno: 5. 9. 2012, 18:43:40
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 |
#3 · Zasláno: 6. 9. 2012, 04:20:38
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 |
#4 · Zasláno: 6. 9. 2012, 11:05:34
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 |
#5 · Zasláno: 7. 9. 2012, 03:30:09
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'); |
||
Časová prodleva: 12 let
|
0