WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP: utf8_decode fungerar inte med vissa tecken (https://www.wn.se/forum/showthread.php?t=33724)

radioaktivitet 2008-12-04 14:17

Jag har en text i UTF8 som jag behöver konvertera till ISO-8859-1. Men vissa tecken blir inte konverterade. Exempelvis detta tecken:



Det är alltså ett citationstecken. På engelska heter tecknet "left double quotation mark".

I utf8 består den av tre bytes: 226 128 156. Man kan nog också skriva tecknet som U+201C

http://www.fileformat.info/info/unicode/ch.../201c/index.htm

Jag har provat att konvertera tecknet med hjälp av utf8_decode() i PHP, men jag får bara ett frågetecken som resultat.

Finns inte tecknet i ISO-8859-1 eller vad? Jag noterar att Webmasternetwork.se, som visas i ISO-8859-1, kan visa mitt tecken ovan. Så det borde ju gå att konvertera?

Tacksam för tips om vad jag gör för fel.

radioaktivitet 2008-12-04 14:39

Jag hittade en lösning

Kod:

        $badchr = array(
          "\xe2\x80\xa6",    // ellipsis
  "\xe2\x80\x93",    // long dash
          "\xe2\x80\x94",    // long dash
  "\xe2\x80\x98",    // single quote opening
          "\xe2\x80\x99",    // single quote closing
  "\xe2\x80\x9c",    // double quote opening
          "\xe2\x80\x9d",    // double quote closing
  "\xe2\x80\xa2"    // dot used for bullet points
  );

        $goodchr = array(
          '...',
  '-',
          '-',
  '\'',
          '\'',
  '"',
          '"',
  '*'
  );
       
        $str=str_replace($badchr,$goodchr,$str);

Men jag vet fortfarande inte varför inte utf8_decode() fungerade av sig själv...

dotvoid 2008-12-04 15:30

Det är inte så konstigt alls. Tecknet finns inte definierat i iso-8859-1. Därmed kan du inte konvertera det från utf-8 till iso-8859-1. Det kommer troligen från windows codepage 1522.

En bra förklaring:
http://bytes.com/groups/php/2773-smart-quotes-php

Finns flera möjliga lösningar på http://www.php.net/utf8_encode

dotvoid 2008-12-04 15:31

Det är snarare så att det finns definierat - men inte som skrivbara tecken.

radioaktivitet 2008-12-04 15:41

Citat:

Originally posted by dotvoid@Dec 4 2008, 16:31
Det är snarare så att det finns definierat - men inte som skrivbara tecken.
Jag tänker inte säga emot dig. Men är det inte konstigt att tecknet visas fint på denna sida (i min ursprungliga post), med tanke på att denna sida är i iso-8859-1? Finns det någon logisk förklaring?

martine 2008-12-05 11:39

Den bästa lösningen är förstås att genomgående använda utf-8 så slipper man att fel och brister i konvertering och begränsningarna i ISO.

(Sedan är förstås utf-8-stödet i php ganska uselt tyvärr.)

tartareandesire 2008-12-05 12:14

Citat:

Originally posted by martine@Dec 5 2008, 12:39

Den bästa lösningen är förstås att genomgående använda utf-8 så slipper man att fel och brister i konvertering och begränsningarna i ISO.
(Sedan är förstås utf-8-stödet i php ganska uselt tyvärr.)

Jag tycker utf8 fungerar bra i php till 99%.

martine 2008-12-05 12:26

Citat:

Ursprungligen postat av tartareandesire
Citat:

Ursprungligen postat av martine
Den bästa lösningen är förstås att genomgående använda utf-8 så slipper man att fel och brister i konvertering och begränsningarna i ISO.
(Sedan är förstås utf-8-stödet i php ganska uselt tyvärr.)


Jag tycker utf8 fungerar bra i php till 99%.

Jo, det fungerar för det mesta bra. Men vad som saknas är direkt stöd om man inte använder mb_string. Man vet aldrig vad en sträng har för teckenkodning och strlen, strpos, substr, osv. kan bryta sönder tecken om man inte är försiktig.

Bättre vore en default_string_encoding som mb_string har för att slippa mystiska problem.

coredev 2008-12-05 13:45

I codepage ISO-8859-1 (aka Latin1) finns, som tidigare sagt, icke tecknet “ utan endast ", och därför går det egentligen inte att konvertera.

Varför visas ändå tecknet “ i våra webbläsare? Antagligen är det så att när webbservern skickar datat till klienten, och ser att här kommer det visst ett unicode-tecken så försöker den en fuling och skickar unicode-koden för “-tecknet istället. Detta kan den göra eftersom Unicode är en slags utökning av ISO-8859-1.

Inte riktigt "rätt" men resultatet blir foolproof.

Mer info: http://en.wikipedia.org/wiki/ISO_8859-1

martine 2008-12-05 18:34

Citat:

Originally posted by coredev@Dec 5 2008, 14:45
Varför visas ändå tecknet “ i våra webbläsare? Antagligen är det så att när webbservern skickar datat till klienten, och ser att här kommer det visst ett unicode-tecken så försöker den en fuling och skickar unicode-koden för “-tecknet istället. Detta kan den göra eftersom Unicode är en slags utökning av ISO-8859-1.
Exempelvis Firefox konverterar "omöjliga" tecken som detta till formen “ vilket exempelvis inte Safari gör innan det skicka från formulär (i alla fall var det så när jag undersökte problemet för några år sedan). Det är anledningen till att man kan posta tecken som egentligen är utf-8 på iso-8859-sidor. Bäst är förstås att använda utf-8 genomgående för att slippa blandningen och som sagt - inte alla webbläsare genomför denna konvertering (om det är riktigt att konvertera tecken som inte finns i en teckenkodning till koder i en annan där det finns kan man ju sedan fråga sig om det verkligen är så bra).

PS. Om webbservern på något sätt skulle parsa text den skickar till webbläsaren vore ju risken stor att man skulle få korrupta bilder eller liknande.


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

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