[PHP] vreemde karakters

Pagina: 1
Acties:
  • 981 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een XML parser aan het schrijven alleen als ik bijvoorbeeld deze zin uit mijn xml bestand lees:

" Trout Meunière and Plaice Meuniére "

Veranderd php het doodleuk in

" Trout Meunière and Plaice Meuniére "

Wat dus niet de bedoeling is aangezien ik deze informatie in een database stop en die database gewoon weer als referentie gebruik voor zoekmachine en dergelijke. Zoeken met replace functies in php lijkt ook niet te werken. hetzelfde probleem heb ik als er ` of ' in de tekst staat.

enkele dingetjes die ik al geprobeerd heb:

preg_replace("/`","",$string);
preg_replace("''","",$string);

etc..

mischien moet ik met ASCII code werken :?

Help!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

php doet daar niets mee hoor ;)

Waarin wordt de output getoond? Die gebruikt waarschijnlijk een andere character encoding

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Die output krijg ik als ik hem in MySQL stop, of zelfs als ik gewoon print:

while ($data = fgets($fp,4096))
{
print $data;
}

Encoding van mijn XML bestanden veranderen is ook geen optie daar deze extern geleverd worden. En trouwens niet eens weet hoe dat moet, XML file zegt

<?xml version="1.0" ?>

boven aan. Gewoon default encoding. Het moet toch mogelijkzijn om é in een database te stoppen zonder al te gekke dingen te doen (ik vind wel allerlei naar html omzet codes maar dat wil ik niet ipv zoeken)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zoals ik al zei, het probleem zit m niet in php, of mysql, maar degene die de output levert (en nee, dat is niet mysql, maar de front-end die de database uitleest, dus de browser bijvoorbeeld). De enconding verschilt gewoon tussen de output en input.

Ik heb geen idee wat de default coding is, en jammer genoeg ondersteund mysql geen unicode (php wel? ook niet toch?)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Helox-in-a-box
  • Registratie: Augustus 2000
  • Laatst online: 19:26
probeer es htmlspecialchars()

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 28-08 11:01
je input is iso-8859-1, xml is default utf-8. wat je ziet zijn de accenttekentjes, vertaald naar utf-8 (2 bytes per character), gezien in iso-8859-1 (1 byte per character).

verdiep je 's in de conversie tussen charsets : http://nl.php.net/manual/nl/ref.iconv.php

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 02-08 19:14
Ik denk dat het iets subtieler ligt dan alleen iso-8859-1 en utf-8, iso 8859-1 heeft nl. geen copyright tekens.

Evengoed moet je XML een character set encoding bevatten als het non-ASCII karakters bevat. En aangezien ASCII de American Standard for Character Information is, zijn alle diakrieten (zo heten die "vreemde" tekens) automatisch non-ASCII. Jouw input bevat dus geen diakrieten, maar invalide karakters. Ik heb in een identiek geval dus in m'n input parser een error message gezet voor dat soort invalide karakters. Dat is precies de reden dat je een encoding standaard gebruikt, zodat het ondubbelzinnig is of een bericht valide is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Zoiets heb ik ook gemaakt. Dit was mijn oplossing, met de strtr functie van php.net:
PHP:
1
2
3
4
5
6
function formatText ($string)
{
    $string = htmlspecialchars ($string, ENT_QUOTES);
    return strtr($string, "ŜŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ", 
    "SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy");
}


Dit heeft mij geholpen en zal bij jouw scriptje ook helpen denk ik

[ Voor 31% gewijzigd door esf op 17-02-2003 18:45 ]

The hardest thing in the world to understand is the income tax. - Albert Einstein


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 28-08 11:01
MSalters schreef op 17 February 2003 @ 18:19:
Ik denk dat het iets subtieler ligt dan alleen iso-8859-1 en utf-8, iso 8859-1 heeft nl. geen copyright tekens.
jawel. nummer 169.
Jouw input bevat dus geen diakrieten, maar invalide karakters.
nee, zijn input is valide iso-8859-1. zijn output is valide utf-8, alleen probeert-ie die te bekijken met iso-8859-1. de diakritische tekens zijn in utf-8 2 bytes, en worden dus vertaald naar 2 characters. ASCII is hier van geen betekenis, het wordt eenvoudigweg niet gebruikt. de enige ruzie is iso/utf.

Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Waarom al die character sets en niet gewoon alle vreemde karakters er uit filteren? Dan ben je van het probleem af...

The hardest thing in the world to understand is the income tax. - Albert Einstein


Acties:
  • 0 Henk 'm!

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 22-08 23:35

GraasGast

Analogue Heaven

Mischien wil hij die tekens juist wel gewoon weergeven, omdat het anders een beetje boerenkool-frans word? |:(

de functie utf8_decode() zou kunnen helpen...haal daar je string eens doorheen voordat je hem naar de output stuurt...

http://php.widexs.nl/manual/en/function.utf8-decode.php


edit: ff getest, en het werkt, deze code:

PHP:
1
2
3
<?php
echo utf8_decode("Trout MeuniÃ&uml;re and Plaice Meuniére");
?>


geeft dit als output:
code:
1
Trout Meunière and Plaice Meuniére


:)

[ Voor 82% gewijzigd door GraasGast op 17-02-2003 22:59 ]


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 28-08 11:01
GraasGast schreef op 17 February 2003 @ 22:52:
de functie utf8_decode() zou kunnen helpen...haal daar je string eens doorheen voordat je hem naar de output stuurt...
utf8_[en|de]code werken inderdaad, maar zijn (imho) gruwelijke hacks. ik gebruik ze zelf nog af-en-toe, maar dan alleen omdat mysql geen utf-8 aankan (zucht). wat zou 't leven toch makkelijk zijn als je alles in utf-8 kon doen :)

Acties:
  • 0 Henk 'm!

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 22-08 23:35

GraasGast

Analogue Heaven

true :)

maar vraagje...nemen alle karakters in utf8 2 bytes in of alleen die die het nodig hebben?

Vanaf versie 4.1.0 snapt MySql unicode! :)

[ Voor 19% gewijzigd door GraasGast op 17-02-2003 23:33 ]


Acties:
  • 0 Henk 'm!

  • Freak_NL
  • Registratie: Juli 2000
  • Laatst online: 22-08 14:17
In UTF-8 neemt een karakter zoveel bytes als hij nodig heeft. :) Dat kan er 1 zijn (de eerste 127 ASCII letters komen er mee overeen) tot 2 of 3 of 4.. :P UTF-16 is een 2-bytes encoding.

Je kan een recente browser ook netjes UTF-8 laten weergeven, je moet alleen zorgen dat de server een http-encoding header stuurt met "UTF-8". Zie maar

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

tech-no-logical schreef op 17 February 2003 @ 23:12:
[...]


utf8_[en|de]code werken inderdaad, maar zijn (imho) gruwelijke hacks. ik gebruik ze zelf nog af-en-toe, maar dan alleen omdat mysql geen utf-8 aankan (zucht). wat zou 't leven toch makkelijk zijn als je alles in utf-8 kon doen :)
Oudere versies van PHP hebben ook helaas niet de mogelijkheid om automatisch de character encoding uit de xmlfile te lezen (php 4.1.2 bijvoorbeeld) en gaan er gewoon doodleuk vanuit dat het utf-8 is. Als je dan het bestand in een browser inlaad ziet het er prima uit, maar output met php geeft die fijne tekens.

Mijn fix er voor was door alles maar door iconv heen te halen en de encoding om te zetten van UTF-8 naar iso. Had het zelf liever in UTF-8 gehouden, maar zoals je al zegt: oudere versies MySQL vinden dat nou weer niet zo leuk. :/

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 22-08 18:18

Zenda

goes milk!

Wat ik zou doen is het volgende:

code:
1
2
3
4
<?
$foo = htmlentities($string);
echo "$foo";
?>


Dit zet alle entities (é ë etc.) om naar htmlentities (é ë etc.)..

edit:


Zet bovenaan je bestand tussen de <head> en </head>:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Dit om te zorgen dat de Content-Type van het uitlezen en invoegen altijd de charset iso-8859-1 gebruikt.

[ Voor 45% gewijzigd door Zenda op 18-02-2003 13:14 ]

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Zenda schreef op 18 February 2003 @ 13:12:
Wat ik zou doen is het volgende:

code:
1
2
3
4
<?
$foo = htmlentities($string);
echo "$foo";
?>


Dit zet alle entities (é ë etc.) om naar htmlentities (é ë etc.)..

edit:


Zet bovenaan je bestand tussen de <head> en </head>:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Dit om te zorgen dat de Content-Type van het uitlezen en invoegen altijd de charset iso-8859-1 gebruikt.

Dat was inderdaad ook mijn oplossing voor dit probleem, ware het niet dat de XML parser dan errors gaat geven over ongedefinieerde entities.. :(

On track


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 02-08 19:14
GraasGast schreef op 17 February 2003 @ 23:21:
true :)

maar vraagje...nemen alle karakters in utf8 2 bytes in of alleen die die het nodig hebben?
Oud perzisch niet, maar ISO 8859-1 past wel in 2 bytes utf-8.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wou idd niet simpelweg de karakters eruit filteren omdat het anders boerenkool frans wordt om maar even Graasgast's uitleg te gebruiken :)

utf8_decode werkt idd prima, bedankt.

utf8_encode werkt ook fijn trouwens, die had ik nodig om op speciale karakters te zoeken in de database, zoeken op Meuniére bijvoorbeeld.

Acties:
  • 0 Henk 'm!

Verwijderd

Bedankt graasgast, zat met net hetzelfde probleem (alleen mijn input kwam van een ldap-query). UTF8_decode lost het probleem mooi op.

Acties:
  • 0 Henk 'm!

  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01 03:23
nog 1 tip,

kijk eens naar de encoding waarin je mysql dbase de boel opslaat. (hoogst waarschijnlijk staat deze op latin1_swedish_ci...) zet die eens op utf8_unicode_ci . Ik denk als ik jouw probleem omschrijving lees dat je dan van een groot deel van je problemen af bent. (je hoeft nu ook geen utf8 encoder oid meer te gebruiken.

edit:

voor je xml verhaal:

zet dit boven in je xml file:

<?xml version="1.0" encoding="utf-8"?>

wordt ook vaak vergeten als je zelf een xml file aanmaakt

[ Voor 21% gewijzigd door toost op 22-05-2006 14:29 ]

This space for rent. Serious inquiries only please.


Acties:
  • 0 Henk 'm!

  • DPLuS
  • Registratie: April 2000
  • Niet online

DPLuS

 

Als je, zoals ik, geen problemen meer wilt krijgen met vreemde tekens in je webapp:

1: Zorg dat apache UTF-8 stuurt:
in httpd.conf: AddDefaultEncoding UTF-8
2: Zorg dat MySQL ingesteld staat op: utf8_unicode_ci

3: Zorg dat je XML pagina's ingesteld staan op: <?xml version="1.0" encoding="utf-8"?>

4: UltraEdit en ZendStudio kun je ook instellen om de php-scripts als UTF-8 weg te schrijven.

5: Gebruik geen ALT+130 meer in je HTML, maar doe netjes:
code:
1
&eacute;

[ Voor 6% gewijzigd door DPLuS op 22-05-2006 16:27 ]


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 02-08 19:14
Via Alt+0xxx kun je in Windows gewoon de ISO 8859-1 Unicode code points invoegen, en als je XHTML pagina's in UTF-8 maakt is er niks mis met U+00E1=Alt-0225 = á. Veel leesbaarder als é en het betekent precies hetzelfde.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Inderdaad; dergelijke HTML/SGML entiteiten zijn eigenlijk enkel nog van belang voor UA's die alleen maar ASCII ondersteunen; ik ken ze niet (meer) ;)

Intentionally left blank

Pagina: 1

Let op:
Let op: dit is een oud topic. Reageer niet op oude berichten. Sterker nog: reageer alleen als je daadwerkelijk iets toe kunt voegen.