[php] [unicode] hoe kan ik unicode ondersteunen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo, ik heb een site gemaakt met een soort content manager, de gebruikers kunnen op de adminpagina een form invullen en vervolgens komt de inhoud van het form in een MySQL db. Wat men heeft getypt komt op de site te staan, bijvoorbeeld in nieuws, events, etc.

Het probleem is nu dat als ik een stukje text uit MSWord kopieer in het formulier (dat doen gebruikers, uiteraard!) dat allerlei tekens zoals ⌐ (Unicode, i guess?) in mijn database terecht komen. geen punt, IE zet die code wel weer om in het werkelijk bedoelde unicode teken, maar ik kan die tekst uit de db natuurlijk niet zomaar in een html pagina pleuren. voordat ik iets in een html pagina neerzet gebruik ik eerst
PHP:
1
2
$str = htmlentities($str);
echo $str;

zodat ik zeker weet dat alle ongeldige tekens worden ge-htmlentitied. Bijvoorbeeld, als een gebruiker html tags in zijn post zet, worden die html tags inactief gemaakt. Maar htmlentities() maakt ook het gecodeerde Unicode karakter inactief :( dus dan krijg ik bijvoorbeeld dit op mijn nieuws pagina:

...blabla met de titel “blabla” is bla bla....

terwijl ik dit bedoelde:

...blabla met de titel “blabla” is bla bla....


nu heb ik twee oplossingen in gedachten, maar beide is het vreselijk, ik hoop dat iemand een beter idee heeft, of hopelijk ervaring hiermee.

1) ik loop alle post data langs met een preg_match om %nnnn; te vinden en alle herkende &#nnnn; zet ik met een soort mapping-tabel om in een gelijkend us-ascii teken. probleem: hoe maak ik een tabel met ALLE unicode karakters en ALLE juiste alternatieven? Mij te veel werk, niet te doen!
2) ik probeer echte Unicode ondersteuning in te bouwen in de site+content manager. dat betekent: _alle_ html forms krijgen de tag accept-charset="UTF-8" zodat de browser Unicode content verstuurd ipv standaard us-ascii. de POST data sla ik gewoon op in de database. die post data bevat dus multibyte characters. als ik vervolgens de text uit de db weer in een html pagina zet, dan zeg ik:
PHP:
1
2
$str = htmlentities($str, ENT_COMPAT, "UTF-8");
echo $str;

De HTML pagina moet dan vervolgens nog dit krijgen:
code:
1
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

en dan komen netjes alle unicode chars in mijn html pagina's! :P

proble(e)m(en): 1- de database slaat multibyte chars op, dus als ik een varchar(100) heb, dan is dat dus 100 chars, _zonder_ unicode van MSWord, maar als er 10 unicode chars instaan, dan werkt de varchar(100) eigenlijk als varchar(90) :(
2- alle normale string functies van PHP werken niet goed met multibyte chars.
3- wie garandeert dat ik post data nu nog wel met reg expressies kan controleren? die reg expr werken volgens mij ook niet met unicode.
4- een hele hele berg extra werk voor mij, met heel veel kans op fouten.

plzzzz, wie heeft er een betere oplossing of wat suggesties.

P.S.: een test of het bij GoT kan: “hoi” (hoi staat tussen openende en sluitende aanhalingstekens, gekopieerd vanuit wordXP. en dat blijkt redelijk te werken op GoT, Adjes wie heeft GoT geprogrammeerd??)
edit:
nog een foutje 2x zelfs

[ Voor 4% gewijzigd door Verwijderd op 23-05-2003 10:16 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

GoT gebruikt htmlspecialchars ipv htmlentities waardoor het 'vanzelf' redelijk goed gaat, maar heeft er geen expliciete ondersteunig voor ofzo.

Werken met unicode is niet heel triviaal in php, maar je zou kunnen kijken naar de multibyte extentie.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
maar ook htmlspecialchars heeft het probleem dat een &#8220; wordt omgezet in &amp;#8220; en die &#8220; krijg ik gratis van een HTML form als iemand daar unicode invult.

dus zelfs als ik voor lief neem dat string functies niet lekker werken heb ik nog steeds het probleem met htmlspecialchars().

het probleem is dus eigenlijk dat zowel htmlspecialchars() als htmlentities() een speciaal character &#nnnn; omzetten in een niet-speciale serie met tekentjes. nog suggesties hoe ik dat oplos? is er een functie zoals htmlspecialchars die de &# combinatie laat staan?

[ Voor 5% gewijzigd door Verwijderd op 23-05-2003 10:32 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je zou die amp; later weer weg kunnen replacen :)
zoiets:
PHP:
1
2
3
$output = str_replace('&amp;amp;#', '&#', $input);
// of wellicht beter:
$output = preg_replace('/&amp;amp;#([0-9]{4})/', '&#\1', $input);

Waarbi ik even vergeten ben na te gaan of de & en de # metachars zijn voor preg-replace :)

[ Voor 4% gewijzigd door ACM op 23-05-2003 10:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
*grin* ik heb daarnet precies hetzelfde ook gedaan
PHP:
1
2
3
$str = htmlentities($str);
$str = preg_replace('/&amp;amp;#(\d{1,5});/', '&#\1;', $str);
echo $str;

:Y) bedankt voor het meedenken

[ Voor 8% gewijzigd door Verwijderd op 26-05-2003 10:13 ]