[php] Character encoding problemen php i.c.m. IE8

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een simpel scriptje gemaakt om te controleren of alles goed gaat met mijn utf-8 encodering en merk dat het bij internetexplorer fout gaat...

In firefox & Chrome krijg ik als ik dit bestand aanroep via: test.php?test=мúĺţìбýřę śťřïňğ het volgende op het scherm:
мúĺţìбýřę śťřïňğ <- in de h1
мúĺţìбýřę śťřïňğ <- in de p

In intenet explorer 8 (en misschien ook in andere IE versies?) krijg ik bij het aanroepen van dezelfde url het volgende als output:
?�lt�?�re str�ng <- in de h1
мúĺţìбýřę śťřïňğ <- in de p

Wat gaat er mis? Vergeet ik iets? Of kan IE niet omgaan met speciale tekens in de url?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
header('Content-Type: text/html; charset=UTF-8');
$test = $_GET['test'];
?>
<!doctype html>
<html lang="nl" class="no-js">
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <title>Test</title>
</head>
<body>
    <h1><?php echo $test; ?></h1>
    <p>&#1084;ú&#314;&#355;ì&#1073;ý&#345;&#281; &#347;&#357;&#345;ï&#328;&#287;</p> // tweakers heeft hier andere tekens van gemaakt, maar hier stond hetzelfde als in de url
</body>
</html>

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 18:36

Ventieldopje

I'm not your pal, mate!

Ik denk omdat deze tekens niet in UTF-8 voorkomen, beste kun je (zoals tweakers al voor je deed) de string door htmlentities gooien ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit zijn volgens mij wel karakters die in UTF-8 voorkomen hoor. Anyway, ook met 'één' gaat het fout in IE8. En een é wordt niet eens vervangen met htmlentities.

[ Voor 43% gewijzigd door Verwijderd op 18-11-2011 11:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hmmm... Het wordt streeds vreemder. Nu blijkt dat de volgende url ook in firefox fout gaat:

test.php?test=één

De output wordt dan: ��n

[ Voor 15% gewijzigd door Verwijderd op 18-11-2011 11:21 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dit lijkt me geen faire test, omdat je direct in de adresbalk de boel intikt terwijl er dan nog geen encoding afgesproken is. Probeer het eens met een UTF-8 pagina ervoor waarvandaan je de get-request doet?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • joppybt
  • Registratie: December 2002
  • Nu online
pedorus schreef op vrijdag 18 november 2011 @ 11:25:
Dit lijkt me geen faire test, omdat je direct in de adresbalk de boel intikt terwijl er dan nog geen encoding afgesproken is. Probeer het eens met een UTF-8 pagina ervoor waarvandaan je de get-request doet?
Inderdaad, dit heeft waarschijnlijk niets met PHP te maken. Hij begint al met ongeldige karakters in de URL. Die 'hoge' karakters moet hij 'URL-encoden'.
Toevallig gaan FireFox en Chrome voor zijn gevoel 'goed' om met de karakters in de URL maar eigenlijk is het ongedefinieerd gedrag.

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Sla je het document ook op als UTF8 zonder BOM (daar kan PHP niet mee omgaan) anders werkt het natuurlijk niet.
Als je een database gebruikt moet je daar natuurlijk ook goed omgaan met UTF8

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik een link maak met dezelfde url erin dan gaat het i.d.d. goed. Nooit geweten dat het zo werkte. Wat ik me dan wel afvraag:

Ik ben bezig met een soort simpel blogje te maken. De urls worden als volgt opgebouwd: test.php?url=[titel van bericht]. In een titel kunnen natuurlijk vreemde tekens gebruikt worden als éàë etc. etc. De url kan dan dus bijvoorbeeld test.php?url=artikeléén. Ik begrijp nu dat het goed gaat als ik een linkje maak vanuit een andere pagina, maar hoe zorg ik er dan voor dat als ik de url zelf intype dat het dan ook goed gaat?

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 11:05
De beste optie is wat mij betreft om de speciale tekens te vervangen door versies zonder diakrieten. "Artikel één" geef je dan het url "test.php?title=Artikel_een". Dan heb je het probleem niet, en het wordt voor mensen nog makkelijker om je URL in te typen ook.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank!

En hoe doe ik dat? Is daar een functie voor in php?

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Wat zegt je webserverlog over de request URL?

Overigens is
T-MOB schreef op vrijdag 18 november 2011 @ 11:50:
De beste optie is wat mij betreft om de speciale tekens te vervangen door versies zonder diakrieten. "Artikel één" geef je dan het url "test.php?title=Artikel_een". Dan heb je het probleem niet, en het wordt voor mensen nog makkelijker om je URL in te typen ook.
Je kunt best er voor kiezen ook een 'Artikel_een'-versie te hebben, maar er is geen enkele reden om geen correcte versie te gebruiken. Bovendien: wat moet een Russische site volgens jou dan doen?

Overigens werkt İlham Əliyev op wikipedia prima in IE8. Alleen snapt GoT het niet zo goed als je die link zó in je bericht plakt :p

[ Voor 105% gewijzigd door ValHallASW op 18-11-2011 12:14 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 15:22

MueR

Admin Tweakers Discord

is niet lief

Verwijderd schreef op vrijdag 18 november 2011 @ 11:57:
Dank!

En hoe doe ik dat? Is daar een functie voor in php?
Er zijn genoeg string manipulation functions. Die staan allemaal op de manual. Heb je zelf al eens wat geprobeerd aan string translation? Oh, nu geef ik je ook nog een zoekterm ook.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben het eens met ValHallASW. Ik weet alleen niet hoe ik in de webserverlog kom. Maakt ook verder niet uit, want ik heb aan de hand van jullie voorbeelden nog wat verder gegoogled en ben tot het volgende gekomen wat altijd lijkt te werken:

PHP:
1
2
3
4
5
6
7
8
<?php
mb_internal_encoding("UTF-8");
ini_set('default_charset', 'UTF-8');
$test = $_GET['test'];
$interenc = mb_internal_encoding();
mb_convert_variables($interenc, "ASCII,UTF-8,iso-8859-1,SJIS-win", $test);
echo $test;
?>


Nu alleen nog de 'string translation' functie voor de url's zonder de éë etc. Misschien kan ik niet goed zoeken, maar ik vind geen functie om de string met speciale karakters om te zetten naar een string zonder speciale karakters. Ik zoek o.a. hier: http://www.php.net/manual/en/ref.mbstring.php

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 11:05
ValHallASW schreef op vrijdag 18 november 2011 @ 12:09:
Wat zegt je webserverlog over de request URL?

Je kunt best er voor kiezen ook een 'Artikel_een'-versie te hebben, maar er is geen enkele reden om geen correcte versie te gebruiken. Bovendien: wat moet een Russische site volgens jou dan doen?
De reden om 1 versie aan te houden is dat zoekmachines niet zo dol zijn op duplicate content. Het gebruiken van "eenvoudige tekens" (dat wil zeggen: tekens uit de ASCII-set) voorkomt de problemen die de TS ervaart (en maakt linkjes makkelijker uit te wisselen op bijv. forums). De reden om binnen de ascii-set te blijven is dat urls volgens de RFC altijd in ASCII moten worden uitgewisseld. Alle niet-ascii-tekens moeten worden ge-url-encode. Dat is wat wikipedia doet: zij linken naar http://nl.wikipedia.org/wiki/%C4%B0lham_%C6%8Fliyev, en dat is ook wat de Russen moeten doen.

In Nederland gebruikt men vaak de titel in een URL om "mooie" URLS te krijgen. Daar helpt URL-encoding niet echt bij. Er zijn weinig mensen die dat vloeiend kunnen lezen.

edit: Je zoekt met de MB-stringfunctionaliteit trouwens in de verkeerde hoek. iconv is waar je functies vindt om character set-vertalingen te doen.

[ Voor 8% gewijzigd door T-MOB op 18-11-2011 12:49 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
T-MOB schreef op vrijdag 18 november 2011 @ 12:44:
De reden om 1 versie aan te houden is dat zoekmachines niet zo dol zijn op duplicate content.
<link rel="canonical" href="/wiki/%C4%B0lham_%C6%8Fliyev" />
Het gebruiken van "eenvoudige tekens" (dat wil zeggen: tekens uit de ASCII-set) voorkomt de problemen die de TS ervaart
Nee, het verbergt alleen het probleem door je vingers in je oren te stoppen en heel hard NANANANANANANANAAAA te roepen. Er is geen enkele reden om het *niet* op een nette manier op te lossen.
Alle niet-ascii-tekens moeten worden ge-url-encode. Dat is wat wikipedia doet: zij linken naar http://nl.wikipedia.org/wiki/%C4%B0lham_%C6%8Fliyev, en dat is ook wat de Russen moeten doen.
Dat (het linken) hoeft niet, want het is welgedefinieerd dat de tekens als urlencoded UTF-8 doorgestuurd moeten worden. Linken naar http://nl.wikipedia.org/wiki/&#304;lham%20&#399;liyev (wat GoT doet) werkt óók gewoon, en als je server wél UTF-8 serveert dan kan je prima http://nl.wikipedia.org/wiki/İlham_Əliyev gebruiken.
In Nederland gebruikt men vaak de titel in een URL om "mooie" URLS te krijgen. Daar helpt URL-encoding niet echt bij. Er zijn weinig mensen die dat vloeiend kunnen lezen.
Dat hoeft dus ook niet, want je hoeft nooit een URLencoded url te zien. Net als je ook niet de technische rommel hoeft te zien als je naar een russische domeinnaam gaat.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
ValHallASW schreef op vrijdag 18 november 2011 @ 14:28:
Dat hoeft dus ook niet, want je hoeft nooit een URLencoded url te zien.
We hebben het hier over IE8, en daar zie je bij die wikipedia-pagina die je aanhaalt toch echt de URLencoded url in de adresbalk.... Daarnaast is het invoeren van speciale tekens ook echt niet makkelijker als de URL uitgeprint is. Zeker in voor Nederlandse content lijkt me de tekens tot ascii beperken dan ook het handigst. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • koendenb
  • Registratie: Januari 2011
  • Laatst online: 09-09 15:59
Hoezo vervang je deze niet op deze manier:
PHP:
1
2
3
$test = $_GET['test']; 
$test = str_replace('é', '&eacute;', $test);
echo $test;


Hier de rest: http://www.ascii.cl/htmlcodes.htm
Kan je trouwens ook een functie voor schrijven.

Natuurlijk is het een groot werk om alles er dan in te zetten, maar kan me niet voorstellen dat iemand die characters uit je first post op zijn scherm wil zien.

[ Voor 57% gewijzigd door koendenb op 18-11-2011 16:27 . Reden: ... ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 11:05
ValHallASW schreef op vrijdag 18 november 2011 @ 14:28:
Dat (het linken) hoeft niet, want het is welgedefinieerd dat de tekens als urlencoded UTF-8 doorgestuurd moeten worden.
Ik was er niet van op de hoogte dat ergens gedefinieerd was hoe een ingetyped url moet worden omgezet naar een ASCII-variant. Maar volgens het web is het sinds 2005 vastgelegd in een RFC. Het lijkt er dus op dat je gelijk hebt dat er geen technische reden is om de "bijzondere" tekens te vervangen.
Behalve dus dat het voor gebruikers lastiger is in te typen (en dat het blijkbaar in IE8 toch niet helemaal goed gaat (gezien de openingspost - mijn apachelogs geven voor IE9 en FF dezelfe urlencoded input weer).
koendenbraven schreef op vrijdag 18 november 2011 @ 16:22:
Hier de rest: http://www.ascii.cl/htmlcodes.htm
Kan je trouwens ook een functie voor schrijven.
Psst: htmlentities(). Maar als je utf8 gebruikt heb je geen enitites nodig.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
koendenbraven schreef op vrijdag 18 november 2011 @ 16:22:
Hoezo vervang je deze niet op deze manier:
PHP:
1
2
3
$test = $_GET['test']; 
$test = str_replace('é', '&eacute;', $test);
echo $test;


Hier de rest: http://www.ascii.cl/htmlcodes.htm
Kan je trouwens ook een functie voor schrijven.

Natuurlijk is het een groot werk om alles er dan in te zetten, maar kan me niet voorstellen dat iemand die characters uit je first post op zijn scherm wil zien.
Met alle respect, maar die is TDWTF-waardig.

a) gaat het hier over UTF-8: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

b) htmlentities / htmlspecialchars

[ Voor 15% gewijzigd door RobIII op 18-11-2011 18:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
koendenbraven schreef op vrijdag 18 november 2011 @ 16:22:
Natuurlijk is het een groot werk om alles er dan in te zetten, maar kan me niet voorstellen dat iemand die characters uit je first post op zijn scherm wil zien.
Uh, dat wil je juist wel...
Pagina: 1