php karakterkeszlet problema: 'Paradox Hun 852 DC'

Szoval van egy ekezetes ungarische szoveg egy mysql tablaban. Ne kerdezd miert, a kodolasa 'Paradox Hun 852 DC'. Ez azert web oldalon nem tul egeszseges, viszont fogalmam sincs, hogy lehetne ezt pl. iso-8859-2-be vagy utf-8-ba atkoldoni php 4.x-ben. Valakinek otlet?

Hozzászólások

> Halam jeleul matol 1 honapig mesternek hivlak.

Ez jelentős túlzás lenne, mivel az eddigi PHP életművem nem haladja meg a 100 sort. Vedd úgy, hogy olvasói hála a könyvedért cserébe ... :-)

> hogy azon a vindozos **son nincs iconv tamogatas.

http://us.php.net/manual/en/install.windows.extensions.php
http://pecl2.php.net/downloads/php-windows-builds/php-libs/

Nem ez a gond (bar nem jo a hex. editor, mert van egy valtozo tartalom sql-ben, es abbol kell dolgozni, tehat a hex. editor jo ma, de ha holnap valtozik a tabla, akkor maceras ujra elovenni), hanem hogy amikor az ord()-dal megnezem a karakter kodjat, akkor nem tudok megkulonboztetni tobb ekezetes karaktert, ld. fentebb.

Ezert kerdeztem, van-e mod mas modon kideriteni egy karakter ascii kodjat. Ami furcsa, hogy Linux-on el is keszult a karakteratkodolo 'tabla', es korrekt modon mukodik is. Ugyanazt a fuggvenyt decode_paradox_shit.._852() atpakolva a vindoze php 4.x gepre, nem mukodik megfeleloen, ld. detto fentebb.

SPAMtelenul - POP3 spamszuro szolgaltatas

> amikor az ord()-dal megnezem a karakter kodjat, akkor nem tudok megkulonboztetni tobb ekezetes karaktert, ld. fentebb.

Nincs win a közelemben, nem tudom megnézni miért lehet ez. Ötletem azért van, szedd szét a szöveget unpack()-al.

Pld: $codes = unpack( "C*", "abcd" ); var_dump( $codes );

vindozen (php 4.4.x nincs benne iconv):

szo1: 'Köretek'

array(7) { [1]=> int(75) [2]=> int(63) [3]=> int(114) [4]=> int(101) [5]=> int(116) [6]=> int(101) [7]=> int(107) }

K*75 � ?*63 � r*114 � e*101 � t*116 � e*101 � k*107 � K?retek

szo2: 'Készételek'

array(10) { [1]=> int(75) [2]=> int(63) [3]=> int(115) [4]=> int(122) [5]=> int(63) [6]=> int(116) [7]=> int(101) [8]=> int(108) [9]=> int(101) [10]=> int(107) }

K*75 � ?*63 � s*115 � z*122 � ?*63 � t*116 � e*101 � l*108 � e*101 � k*107 � K?sz?telek

Jol lathato, hogy az 'ö' és az 'é' eseteben ugyanazt az ascii kodot adja vissza.

******************

Linuxon (php 5.x van benne iconv tamogatas):

array(7) { [1]=> int(75) [2]=> int(148) [3]=> int(114) [4]=> int(101) [5]=> int(116) [6]=> int(101) [7]=> int(107) }

Köretek

array(10) { [1]=> int(75) [2]=> int(130) [3]=> int(115) [4]=> int(122) [5]=> int(130) [6]=> int(116) [7]=> int(101) [8]=> int(108) [9]=> int(101) [10]=> int(107) }

Készételek

Itt mindjart mas a leanyzo fekvese. Az 'ö' kodja 148, mig az 'é' kodja 130.

SPAMtelenul - POP3 spamszuro szolgaltatas

> ugyanazt az ascii kodot adja vissza.

A kérdőjel szerintem arra utal, hogy a kliens (php) vagy a szerver (mysql) gépen nincs meg egy kód konverziós tábla. Ezek szerint minden >128 kódú bájt helyére '?' kerülne.

Ahogy nézem (http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html) le lehet tiltani, hogy a mysql kód konverzióval próbálkozzon:

If you do not want the server to perform any conversion of result sets or error messages, set character_set_results to NULL or binary:

SET character_set_results = NULL;

Ettől változhat a helyzet, megkülönböztethetőkké válhatnak az ékezetes betűk. Vagy nem. Egy próbát lehet hogy megér.

Ha nem férsz hozzá az adatbázishoz, akkor megpróbálhatod így:

mysql_query("SET NAMES 'utf-8'");
mysql_query('SET CHARACTER SET utf8');

Ezt minden oldal elején a kapcsolat felépítése után küld el.
Elég rég foglalkoztam mélyebben PHP-val ,de úgy rémlik ez segít.