ugrás a tartalomhoz

Kis- és nagybetűk UTF-8-ban, PHP/MySQL

joschy · 2006. Jan. 14. (Szo), 00.31
Sziasztok!

Bíbelődök egy kóddal amit kaptam, ami pontosan azt takarja, hogy próbálok bele UTF-8 supportot szenvedni - és persze egy érdekes problémába ütköztem, amit nem nagyon tudok kitalálni, úgyhogy bennetek bízom :o)

Van egy array-em ($mystuff), amit mysql-bol szíjjok:

"SELECT DISTINCT LOWER(SUBSTRING(mystring_name, 1, 1)) AS A FROM $db_table_mytable"

Ebből próbálnék megy olyat alkotni, hogy az első karakterek betűinek létezésekor adott betű link lesz (avagy értelmesebben ABC szerinti brózolásról van szó). Eredendően latin1 a cucc, és így néz ki a dolog:
<?php
while (!$mystuff->EOF) {
        if (ord($mystuff->fields[0]) >= 192 and ord($mystuff->fields[0]) <= 222 and ord($mystuff->fields[0]) != 215) // "Select lower"
                $mystuff->fields[0] = chr(ord($mystuff->fields[0])+32); // above doesn't work with ascii > 192, this fixes it
        $let .= $mystuff->fields[0]; // it could be "a" or "A", so just go with the only returned item
        $mystuff->MoveNext();
}
Ebbe kéne belenyomnom, hogy UTF-8 esetén is megalálja az első betűket, ha lower, ha upper. Nincs valami tippetek, hogy hogyan tudom megtalálni UTF-8-ban az adott betű capital párját akár ékezetesek esetén is?

Előre is köszönöm,
Dzsó
 
1

lower miért nem elég?

Hojtsy Gábor · 2006. Jan. 14. (Szo), 01.04
A SUBSTRING() és a LOWER() teljesen jól vissza fogja neked adni az első karaktert, ha UTF-8-as adattal van dolga. Persze, ha olyan karakterkódolásra van beállítva a tábla.
2

<Nincs cím>

joschy · 2006. Jan. 14. (Szo), 14.27
Szia!

Kösz a reply-t :o)

Valami pedig valahgyan nem stimmöl. Ilyenek vannak most benne teszt jelleggel a táblában:
Állam
Áram
áram
élelem
Éleskés
elemér


Csinálok egy ilyet:
<?php
$thisSQL = "SELECT * FROM $db_table_mytable";

$sql = "SELECT DISTINCT LOWER(SUBSTRING(mystring_name, 1, 1)) AS A FROM $db_table_mytable";

$thisMYSTUFF = $DB_LINK->Execute ( $thisSQL );
$mystuff = $DB_LINK->Execute( $sql );

echo "$thisMYSTUFF<br><br><br>$mystuff";
Ennek a következő lesz az eredménye:

28,Állam, 29,Áram, 30,áram, 31,élelem, 32,elemér, 33,Éleskés,
A � e

Akárhogy is nézem valahol valamié elszáll és arra gyanakszom, hogy az ASCII-vé alakításnak (ord) van hozzá köze. Se Á se á se É se é.

:o/

Any tipp?
3

tábla által használt kódolás

Hojtsy Gábor · 2006. Jan. 14. (Szo), 14.57
Már megvolt a tipp, nem válaszoltál arra, hogy mi van beállítva a tábla által használt karakterkódolásnak, és egyben melyik verzióját próbálod használni a MySQL-nek?
4

akkor more info

joschy · 2006. Jan. 14. (Szo), 21.37
Szia :-)

Kodolas mindenhol UTF-8 ami mukodik is mint latod above, a select *-nal rendesen le is szippancsa a dolgot :-)

Verzio: 5.0.18 (berkdb perl ssl utf8 tamogatasokkal)
5

két dologról beszélsz

Hojtsy Gábor · 2006. Jan. 15. (V), 13.46
A #2 hozzászólásban két SQL parancs van, ennek kezelnie kell jól az UTF-8-at, ha UTF-8-ra van állítva a tábla. Ott írtad, hogy ez nem jól megy, és az ord()-ra gyanakszol. De a #2-ben bemutatott példában a #2-ben bemutatott kimenettel nem lehet ord() a hibás, mert ord() nincs a kódban! Az ord() különben persze hogy nem megy UTF-8-al, ugyanis a karakterosorozat mint tömb indexelés az PHP 6(!) előtt nem támogat UTF-8-at. Ezért irtam már az első hozzászólásban, hogy miért is nem elegendő SQL parancs segítségével lekérni az első betűket, minek neked ord()?
6

<Nincs cím>

joschy · 2006. Jan. 21. (Szo), 22.06
Szia :o)

Az első postold kódban volt ord :o) És éppen ez az, amit nem akartam használni, node sikerült idő közben megoldanom a dolgot.
Az igazi ok pedig amiért php-ben oldottam meg a sort-ot, a teljes magyar ÁBC kezelése (gondolok itt a d/dz/dzs sortolására úgy, hogy betűkénti browsoláskor mindig csak az aktuális jelenljen meg, avagy a Dániánál nem kell látnom a Dzsem-et).

Köszönöm minden esetre :o)

Üdv:
joschy