ugrás a tartalomhoz

UTF8 ékezet 1 karakter, vagy 2 karakter hosszú?

baller2 · 2007. Jún. 6. (Sze), 14.54
Sziasztok!

Adott egy oldal és a mögötte lévő MySQL adatbázis, ahol minden UTF-8 kódolású.
Az egyik feladata az oldalnak, hogy válogassa le pl. az "a" kezdőbetűs szavakat az adatbázisból.
Eddig minden rendben is van. Megkapom a következő listát kiíratva az oldalon (ékezetek, minden tökéletesen helyes):

Alma
asztal
Ágy
állat
autó
ablak
árok
Ás
..
....
stb.

A feladatom és a problémám egyben a következő: le kell(ene) minden szó első betűjét vágnom, azonban az UTF-8 kódolás miatt ez az ékezetes kezdőbetűknél nem működik.. :(

Ezzel a paranccsal akarom megkapni a kisbetűsre konvertált első karaktert: $first_cap=strtolower($myrow[0]{0});
de próbáltam így is: $first_cap=substr($myrow[0],0, 1);

Ezek a parancsok sajnos csak a nem ékezetes kezdőbetűjű szavaknál működtek.
ha pl. az Ágy szóhoz érkezem, a válasz IE alatt egy kis kocka, illetve Firefox alatt egy ? lesz.
Megpróbáltam az utf8-decode és az iconv függvényeket is, de nem lett jobb a helyzet.

Rájöttem azonban, hogy ha az ékezettel kezdődő szavak első két karakterét vágom ki, pl.:
$first_cap=substr($myrow[0],0, 2);
akkor fogom megkapni a $first_cap változóba az "á" karaktert.

Ez remek, már csak el kellene tudnom dönteni, hogy mikor vágjak le a szó elejéről egy és mikor kettő karaktert.

Ötlet, tipp...?
 
1

mb függvények

whatwho · 2007. Jún. 6. (Sze), 15.05
multibyte fv-ek a barátaid:

http://hu.php.net/manual/hu/function.mb-substr.php
2

saját fv

vbence · 2007. Jún. 6. (Sze), 15.12
Ha esetleg minimális PHP telepítésben dolgozol (nincs mb_string, iconv stb..), ezzel iso8859-2 -be tudod fordítani az utf-es stringedet (ami így már fix 8 bites):

http://vbence.web.elte.hu/utf8_latin2_iso8859_2_kovertalas.html
3

más megoldás

gex · 2007. Jún. 6. (Sze), 16.27
nemrég belefutottam hasonló problémába, nekem ez lett a megoldásom:

<?php
$string = utf8_decode(strtr($string, 'őŐűŰ', 'õÕûÛ'));
?>
4

Kiegészítés

vbence · 2007. Jún. 6. (Sze), 16.34
Tedd hozzá, hogy a php fájl kódolása utf-8 (anélkül nagyon félrevezető).
5

igaz

gex · 2007. Jún. 6. (Sze), 16.51
igazad van.
6

Megoldva!

baller2 · 2007. Jún. 6. (Sze), 16.53
Köszönöm a nagyon gyors válaszokat!

Lehet, hogy nem fogalmaztam tisztán, maga a PHP fájl és az oldal is UTF-8-as kódolású. :)

whatwho megoldása tökéletes volt!
A multibyte függvények ezen belül az mb_substr tökéletesen működik, de csak akkor, ha előtte meghívom a mb_internal_encoding("UTF-8"); függvényt is.

Nagyon szépen köszönöm!

Bence megoldására már korábban is ráakadtam a google segítségével, most is megpróbáltam becsülettel, de sajnos nekem nem sikerült vele jó karaktereket csinálnom valószínű azért, mert nekem az oldal is UTF-8-as kódolású, de a függvényt elmentettem magamnak, máskor még jól jöhet! :)
Az UTF decode függvényt is próbáltam, amit GEX írt, de nekem az sem volt jó megoldás.

Még egyszer nagyon köszönöm a gyors válaszokat és a megoldást! :)

ballR
7

Minden utf-8?

Gixx · 2007. Jún. 6. (Sze), 16.58
PHP 5.1+, MySQL 5.0

Ha a MySQL DB:

CREATE DATABASE `mydb`
    CHARACTER SET 'utf8'
    COLLATE 'utf8_hungarian_ci';
valamint a MySQL tábláid:

CREATE TABLE `mytable` (
  `word` varchar(255) collate utf8_hungarian_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;
és minden php fájl utf-8-as kódolású, és a db-hez való csatlakozás után a legeslegelső query a

mysql_query("SET NAMES 'utf8';", $conn);
illetve a lekérdezések eleve:

SELECT word FROM mytable WHERE word LIKE BINARY 'á%' OR word LIKE BINARY 'Á%';
majd a php oldalon:

$charmap = array(
  'Ö' => 'ö',
  'Ü' => 'ü',
  'Ó' => 'ó',
  'Ő' => 'ő',
  'Ú' => 'ú',
  'É' => 'é',
  'Á' => 'á',
  'Ű' => 'ű',
  'Í' => 'í'
);

$first_cap = substr( strtolower( strstr($myrow[0], $charmap), 0, 1);

továbbá a generált xhtml kód is utf-8:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="hu" />
és a javascriptek és a css fájlok is mind utf-8-as kódolásúak:

<meta http-equiv="content-style-type" content="text/css; charset=utf-8" />
<meta http-equiv="content-script-type" content="text/javascript; charset=utf-8" />

<link rel="stylesheet" type="text/css" href="style.css" media="screen" charset="utf-8" />
<script type="text/javascript" src="script.js" charset="utf-8"></script>
akkor nagyobb eséllyel lesz jó a kódod. Szerintem... Én így használom, és nálam nincs ilyen duplakarakter probléma.

De ha ez sem segít, akkor érdekel, hogy mi a jó megoldás :)
8

Talán

baller2 · 2007. Jún. 6. (Sze), 17.13
Mint fentebb is írtam, nekem a multibyte függvények jelentették a megoldást.
Azért is szerencsésebb nekem az mb_substr függvényeket használnom, mert nem csak magyar szavakat fog az oldal majd listázni, és ez olyan esetekben is segít, mind a szláv nyelvekben lévő "kalapos" betűk. (Pl. a Skoda felirat S betűjénak is a tetején kis "kalap" van.)
Ezért nekem nem célom hogy az SQL leválogatásnál binary szűrjek, amit egyébként kipróbáltam, működik, de a karakterekre bontás még így sem lett megoldva.

Viszont az mb.substr függvény tökéletes, mert ha én az első karaktert kérem a szóból, vagy az ötödiket, akkor is pontosan az (és csakaz!) a karakter kerül levágásra, ami nekem kell.

És végre így újra meg tudom számolni az egys szavak betűinek számát az mb_strlen -nel, mert a sima strlen a kódolás miatt mindig többet mondott.

Jó jó ez az UTF, de egy csomó problémát is generál a megszokott eljárásokhoz képest... :)
9

mi a megszokott?

Sulik Szabolcs · 2007. Jún. 7. (Cs), 18.04
Jó jó ez az UTF, de egy csomó problémát is generál a megszokott eljárásokhoz képest... :)


A kérdés az, hogy mi a megszokott. Ez egyébként nem az utf-8, hanem a php hibája (régi verziókban szegényes támogatás; talán a php 6).