WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   utf-8 url_decode php (https://www.wn.se/forum/showthread.php?t=37334)

CarlFredrikHero 2009-06-09 22:51

Jag jobbar på nästa version och jobbar på ett av de största problemen med den nuvarande versionen.

Webbplatsen ska använda UTF-8 och bygger till stor del på en sökruta.

Det är viktigt att webbplatsen klarar av att hantera dessa två typer av sökningar:
Det översta alternativet har jag lyckats med så det jag behöver är en funktion som avkodar urler korrekt.

header(), meta-taggen samt mitt program (Notepad++) är inställt på UTF-8.

Tacksam för all hjälp!

Carl-Fredrik Herö,
vemringde.se

Jimpsson 2009-06-09 22:53

http://se.php.net/manual/en/function.urlencode.php
http://se.php.net/manual/en/function.urldecode.php

CarlFredrikHero 2009-06-09 23:03

De funktionerna är tyvärr oanvändarbara med UTF-8. De förutsätter ISO-8859-1 och ger väldigt konstiga resultat med UTF-8.

Har dessutom försökt att först konvertera till ISO-8859-1 för att sen köra urldecode-funktionen, det funkar inte heller tyvärr.

Jimpsson 2009-06-09 23:10

Testa följande:
* Spara filen som UTF-8 (Utan BOM)
* Sätt header, om du inte gjort det. header("Content-type: text/html; charset=utf-8");

Testa sedan url_decode.

Funkar det ändå inte, pröva då denna funktion (hittade på php.net):
Citat:


function utf8_urldecode($str) {
$str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str));
return html_entity_decode($str,null,'UTF-8');;
}


CarlFredrikHero 2009-06-09 23:42

2 bifogad(e) fil(er)
Filen är sen tidigare satt UTF-8 (testade även utan BOM)
header är satt till UTF-8 och även <meta>-taggen

Testade ditt script men allt jag får är sm�r.

Bifogar min testfil, den som vill får gärna testa och göra förändringar (ändra filändelsen till .php).

Jimpsson 2009-06-09 23:48

Testade exakt den kod du postade här ovan på min server och det fungerar som det ska, har ingen aning om vad som felar för dig då faktiskt.

WoxAnYv 2009-06-10 08:36

Citat:

Originally posted by CarlFredrikHero@Jun 10 2009, 00:42
Filen är sen tidigare satt UTF-8 (testade även utan BOM)
header är satt till UTF-8 och även <meta>-taggen

Testade ditt script men allt jag får är sm�r.

Bifogar min testfil, den som vill får gärna testa och göra förändringar (ändra filändelsen till .php).

Lägg till följande efter att du läst in get:en

Kod:

$q = mb_convert_encoding($q, 'utf-8','iso-8859-1');
Då borde det se bra ut, det konverterar strängen då till utf-8, frågan är bara hur den då hanterar saker och ting som råkar komma i andra format än iso-8859-1 förstås. Så det får du kika närmare på men ja, det är ett steg mot en lösning.

CarlFredrikHero 2009-06-10 12:49

Tack WoxAnYv! Det är helt klart mb_convert_encoding som fixade biffen.

Men, som du också säger så funkar den inte om söksträngen redan är UTF-8.

Sökningen http://vemringde.se/?q=smör blir då fel istället. Finns det någon funktion som kan identifiera en söksträngs Charset?

CarlFredrikHero 2009-06-10 14:17

2 bifogad(e) fil(er)
Nu har jag skrivit en egen funktion som letar efter åäö plus lite andra liknande tecken. Det verkar som om det fungerar men jag undrar om jag har glömt något tecken?

Testa gärna scriptet och tala om vad ni tycker!

SimonP 2009-06-11 15:30

Jag har haft likande problem förut, denna kod löser ditt problem på ett bättre sätt:

Kod:

<?php
header("Content-type: text/html; charset=utf-8");
 
function is_utf8($string)
{
 * /* From http://w3.org/International/questions/qa-f...orms-utf-8.html */
        return preg_match('%^(?:[\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$%xs', $string);
}
 
$q = urldecode($_GET['q']);
if (!is_utf8($q)) $q = utf8_encode($q);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang="sv" lang="sv">
        <head>
 *<title>UTF-8 url decode test</title>
 *<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        </head>
<body>
<?php
echo "Q = $q<br>";
?>
<form method="GET" ><input name="q" value=""><input type="submit"></form>
</body>
</html>

Har kört skriptet ovan på både Windows och Linux servrar.


Alla tider är GMT +2. Klockan är nu 12:59.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson