Kom ihåg mig?
Home Menu

Menu


PHP: utf8_decode fungerar inte med vissa tecken

 
Ämnesverktyg Visningsalternativ
Oläst 2008-12-04, 14:17 #1
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-04, 14:39 #2
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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...
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-04, 15:30 #3
dotvoid dotvoid är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 199
dotvoid dotvoid är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 199
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-04, 15:31 #4
dotvoid dotvoid är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 199
dotvoid dotvoid är inte uppkopplad
Medlem
 
Reg.datum: Apr 2006
Inlägg: 199
Det är snarare så att det finns definierat - men inte som skrivbara tecken.
dotvoid är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-04, 15:41 #5
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
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?
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-05, 11:39 #6
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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.)
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-05, 12:14 #7
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
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%.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-05, 12:26 #8
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-05, 13:45 #9
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
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
coredev är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-12-05, 18:34 #10
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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.
martine är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:54.

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