ugrás a tartalomhoz

UTF-8 Search

joschy · 2006. Jan. 22. (V), 00.45
Sziasztok!

Nincs valakinek egy UTF8-as anti-ékezetező function-ja valahol? :o)
Ha nem van, akkor persze szívesen megcsinálom és közzéteszem, csak egy tipp kéne, hogy vajon hogyan lesz: é=e ő=o stb.

(doksinak is örülnék)

Előre is köszönöm,
joschy
 
1

Van

attlad · 2006. Jan. 22. (V), 02.08

function deaccent_utf8($string)
{
	$trans = array(
		"\xc3\xa1" => 'a',
		"\xc3\xa9" => 'e',
		"\xc3\xad" => 'i',
		"\xc3\xb3" => 'o',
		"\xc3\xb6" => 'o',
		"\xc5\x91" => 'o',
		"\xc3\xba" => 'u',
		"\xc3\xbc" => 'u',
		"\xc5\xb1" => 'u',
		"\xc3\x81" => 'A',
		"\xc3\x89" => 'E',
		"\xc3\x8d" => 'I',
		"\xc3\x93" => 'O',
		"\xc3\x96" => 'O',
		"\xc5\x90" => 'O',
		"\xc3\x9a" => 'U',
		"\xc3\x9c" => 'U',
		"\xc5\xb0" => 'U'
	);
	return strtr($string, $trans);
}
(Ha PHP fájlt UTF-8-ként mented, pl. \xc3\x81 helyett simán írhatsz Á-t is.)

De Unicode táblázatok itt: http://www.unicode.org/charts/
Latin-1 táblázat: http://www.unicode.org/charts/PDF/U0080.pdf (de ő, ű Latin Extended A-ban van)
Pl. Á -> kódtáblázatban a kódja 00C1 -> binárisba átváltva: 11000001
Wikipedián van egy táblázat: http://en.wikipedia.org/wiki/UTF-8#Description
Táblázat alapján: 00C1 az 000080–0007FF között van ezért:
Ebbe: 110zzzzx 10xxxxxx kell beírni az előbbi binárist (00011000001)
Ez lesz: 11000011 10000001 (2 bájt) -> hexába: C3 és 81
PHP: \xc3\x81

De pl. PHP ord()-dal is megkaphatóak a kódok:

$s = 'Á';
echo ord($s{0}), ' ',  ord($s{1});
2

<Nincs cím>

joschy · 2006. Jan. 22. (V), 14.44
Szia!

Nagyon koszonom a valaszod :-)

Bonyolitsuk meg egy kicsit a dolgot:
Van-e barmi lehetoseg arra, hogy automatikusan kitalaljam, hogy ő,ö,ó-nak o az ekezet nelkuli valtozata?
Azert erdekelne, mert bar alapom a magyar ABC, de tovabbi nyelvi valtozatok keszulhetnek, ezert valami olyan eljarason torom a fejem, ami automatikusan minden ekezetesnek megtalalja az ekezet nelkuli parjat.
Az egyetlen kiindulasi alapom jelenleg a nevbol van (pl: o with ancent), byte szinten nem tudom lehet-e ilyet.

ord-dal nem szivesen csinalnam, mert eleve UTF-8 kodolasom van, ord ezt meg elcseszi mivel ASCII-ve nyomja at a cuccot; avagy:
$s = 'Á';
echo chr(ord($s{0})), ' ',  chr(ord($s{1}));
mar furan nez ki :-)

Szoval azon kivul, hogy azt mondom, hogy:
function deaccent_utf8($string)
{
"ù" => 'u',
"ú" => 'u',
"ü" => 'u',
"û" => 'u',
"Ũ" => 'u',
"ũ" => 'u',
"Ū" => 'u',
"ū" => 'u',
"Ŭ" => 'u',
"ŭ" => 'u',
"Ů" => 'u',
"ů" => 'u',
"Ű" => 'u',
"ű" => 'u',
"Ų" => 'u',
"Ư" => 'u',
"ư" => 'u',
"Ǔ" => 'u',
"ǔ" => 'u',
"Ǖ" => 'u',
"ȗ" => 'u',
"Ȗ" => 'u',
"ȕ" => 'u',
"Ȕ" => 'u',
"Ṳ" => 'u',
"ṳ" => 'u',
"Ṵ" => 'u',
"ṵ" => 'u',
"Ṷ" => 'u',
"ṷ" => 'u',
"Ṹ" => 'u',
"ṹ" => 'u',
"Ṻ" => 'u',
"ṻ" => 'u'
...
   );
    return strtr($string, $trans);
}
letezik-e valami automatizalhatobb megoldas?

Avagy ez igy eleg huzos lenne :-)

Koszi,
joschy
3

Nem tudok róla

attlad · 2006. Jan. 22. (V), 15.58
Én eddig csak magyart akartam ékezetmentesíteni, arra a fenti a legegyszerűbb. De szerintem nem lehet a karakterkódokból kitalálni. A névből kitalálás az nem rossz ötlet, de az is max. arra, hogy elkészítsd ezt a megfeleltetés listát (mert azzal gyorsabb dolgozni). Szóval a listát egyszer mindenképp el kell készíteni, de biztos van aki már meg is csinálta valahol.. ha van más megoldás az engem is érdekelne.

(Amúgy chr()-es példa csak azért nem megy, mert a space-t benne hagytad a két bájt között.)
4

<Nincs cím>

joschy · 2006. Jan. 22. (V), 16.06
Hello,

SQL oldalrol is megprobaltam megkozeliteni a dolgot, de nem nagyon talaltam ott sem mas megoldast (mer ugye seach van), hogy letarolom kulon az ekezet-mentesitett verziot, de persze ehhez php-ben is kell dolgozni egy kicsit, mert ugye csak annak kellene letarolni az ekezet-mentesitett verziojat ami eleve ekezetes, nehogy 2 match legyen :-)

Koszi mindenesetre :-)

Udv:
joschy
5

strtr

Anonymous · 2006. Jan. 22. (V), 17.19
http://hu2.php.net/strtr

return strtr($string,
"ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ",
"SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy");

Nem próbáltam, de majd egyszer...

Üdv
Zoli
6

<Nincs cím>

joschy · 2006. Jan. 22. (V), 18.33
Szia

Nagyon hosszunak nez ez ki ha csak azt veszem, hogy 32+ U-beture konvertalandot nyomtam be az elobb, es az meg nem volt az osszes :-) nem beszelve az o a e i, es a mas nyelvekben honos massalhangzos dolgokra, kukacos, meg kalapos n, es tarsai :-)

De aze kosz, mindenkepp :-)

joschy
7

Experimental

hamlet79 · 2006. Jan. 22. (V), 22.54
És mi lesz az Experimental Programminggal? :)

Egyébként minek kell az ékezetmentesítés?
10

<Nincs cím>

joschy · 2006. Jan. 23. (H), 08.33
pszt :-) olvasd el az elso beszolast es let there be light ;-)
Az igazi ok persze az, hogy jomagam aki mindig a magyar cuccok teljes tamogatasa mellett szoktam lobbizni azert ekezet nelkul keresek mindent :-) Avagy arrol van szo, hogy meg kene talalnom az árvíztűrő tükörfúrógépet arvizturo tukorfurogep neven is :-)
8

Nem lehet

attlad · 2006. Jan. 23. (H), 01.49
Ezt így nem lehet, mert PHP nem támogatja UTF-8-at, majd kb. PHP 6-ban valamiko'
9

<Nincs cím>

joschy · 2006. Jan. 23. (H), 08.28
Akkor asszem csinalok gyorsan egy feature requestet (ha meg nincs ilyen), hogy ne nekem kelljen lustasagom csucspontjanak kibontakozasa pillanataban leprogramozni az egesz szart :-D

Jelenleg 2 otvar megoldas letezik a problemara, es mind2-nel meg koll valositani egy ilyen manualis ide-oda konverzios dolgot, tehat elkerulhetetlen egy utf-8 deaccenter function letrehozasa :-)
1) sql-ben letarolom az ekezet-mentes nevet is egeszen addig amig nincs jo megoldas :-)
2) mindent atszivok php-ba (SELECT * FROM sky), es ottan probalkozok realtime ezzel az ide-oda konvertalommal.

A kerdes az, hogy vajon php-ban megoldva a dolgot mennyivel nagyobb performance impact, mintha egy SQL szerver csinalna?

Koszi,
joschy
11

Itt tal'lsz egy megoldást

Poetro · 2006. Jan. 25. (Sze), 14.59
http://www.poetro.hu/sandbox/cleanstring.php
--------
Poetro