XML character encoding för svenska bokstäver

Permalänk
Medlem

XML character encoding för svenska bokstäver

Håller på med php5 och simpleXML. Jag läser data från en fil som jag skriver ut.

Problemet är att alla svenska bokstäver (åäö) blir konstiga tecken.
Vilken character encoding skall jag välja?

Har testat med lite olika, bl.a

  • iso-8859-n (där n står för ett ental) - elementet skrivs ut, men med konstiga bokstäver.

  • utf-8 - ger parse error i XML filen där jag använder svenska bokstäver

  • utf-16 - ger parse error i XML filen där jag använder svenska bokstäver

Som synes fungerar ingen. Vilken skall man välja? Nån bra länk mottages gärna

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

Kan du inte köra med teckenkodningarna för åäö då? & auml; osv

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mucha
Kan du inte köra med teckenkodningarna för åäö då? ä osv

Nej, det funkar inte det heller. Om jag t.ex skriver koden för Ä , Ä , så får jag följande fel:

Warning: simplexml_load_file() [function.simplexml-load-file]:natt.xml:26: parser error : Entity 'Auml' not defined in C:\Program\wamp\www\Sanda\news\test.php on line 2

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

"& amp;auml;" då? utan mellanslaget och "-tecknen. Gick inte att visa det här utan mellanslaget

Permalänk
Citat:

Ursprungligen inskrivet av mucha
"& amp;auml;" då? utan mellanslaget och "-tecknen. Gick inte att visa det här utan mellanslaget

tips: sätt en [.B][./B] mellan tecknerna, som såhär: & (syns bättre om du citerar mig)

OnT: Ingen aning om vad du ska göra

Visa signatur

There is no future in timetravel.
site: undef.io - foto: bildad.se, flickr
Det enda vettiga är att sitta i en låda och dricka öl ur en hatt.

Permalänk
Medlem

I vilket format är själva XML-filen sparad?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av mucha
"& amp;auml;" då? utan mellanslaget och "-tecknen. Gick inte att visa det här utan mellanslaget

var ju det jag menade att jag gjorde. Men år fortfarande dessa konstiga tecken. Fattar int evad som är fel, men borde vara character encoding? När jag ändrar sådan så ändrar sig de konstiga tecknena iaf.

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

Har du prövat använda UTF-8 och även sparat filen med notepad som UTF-8?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av madah
Har du prövat använda UTF-8 och även sparat filen med notepad som UTF-8?

Ja, det har jag gjort, men då försvinner alla å,ä och ö från filen.

Fasen alltså, får ingen ordning på det. Det skall väl gå att använda svenska bokstäver i xml.
Kan det vara i simplexml_load_file() i php som felet sitter?

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

Har ingen kunskap om xml, men jag gissade lite. Är det såhär du menar?

hafftigatecken.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> <test> <title>å,ä,ö</title> <saker>mm</saker> </test>

print_r.php:

<pre><?php $xml = simplexml_load_file('hafftigatecken.xml'); print_r($xml); ?></pre>

Utmatning:

SimpleXMLElement Object ( [title] => å,ä,ö [saker] => mm )

Permalänk
Medlem

Det som CIC säger fungerar och ger önskvärt resultat.
Jag har dock modifierat CIC: s exempel nedan och lagt till en variabel ($mes) som innehåller en sträng som säger "Hej på Dig". När jag sedan skriver ut de båda variablerna med print så blir å ä ö från xml filen konstiga. Det spelar ingen roll om jag skriver ut $title eller $mes först, $title blir konstig iaf.

hafftigatecken.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> <test> <title>å,ä,ö</title> <saker>mm</saker> </test>

print.php

<?php $xml = simplexml_load_file('hafftigatecken.xml'); $title = $xml->title; $mes= "hej på dig"; print($title); print($mes); ?>

Utmatning:

Ã¥,ä,öhej på dig

Varför blir det så? Skall jag använda någon annan funktion än print? eller skall jag hämta värdet från xml filen på något annat sätt?

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

ok.. lite forskning:

Funkar i firefox (testade bara där). Men inte i Opera eller IE.
Om man lägger till:

<?xml version="1.0" encoding="ISO-8859-1"?>

i .php dokumentet med så blir det häfftiga tecken i friefox med.

Permalänk
Medlem

en odokumenterad feature med simplexml är att allt kodas som UTF8, oavsett vad det står i XML-filen...
utf8_decode runt värden innan utskrift alltså.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Detta har väl att göra med xmlhttp skulle jag tro och precis som jovnas säger så går det inte att göra något åt teckentabellen.

Du kommer så fort du försöker få ut XML som XML eller Text att få en "översättning" av alla tecken som inte ingår i UTF-8.

En lösning är att istället använda "xmlHttp.responseBody" som är i binär format och sedan köra en "binary_to_text" funktion som översätter binär blobben till ascii text. Då hänger å,ä, ö med...

Tyvärr kan jag inte PHP tillräckligt bra för att hjälpa, men kanske någon vänlig själ här har en funktion för det, alt. så finns ju alltid Google...

Hoppas det kan hjälpa dig på rätt väg...

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem

haftigatecken.xml

<?xml version="1.0" encoding="utf-8"?> <test> <title>å, ä, ö</title> <saker>mm</saker> </test>

print.php

<?php header('Content-type: text/html; charset=utf-8'); $xml = simplexml_load_file('hafftigatecken.xml'); $title = $xml->title; $mes= "hej på dig"; print($title); print($mes); ?>

Funkar för mig i alla fall. Båda filer sparade i utf-8.
http://home.student.uu.se/d/daki0267/test/teckenkodning/print...

edit: eller kanske inte, ibland funkar det och ibland inte.

Visa signatur

Sverige är ett så litet land att det bara får plats en åsikt i taget där.

Permalänk
Citat:

Ursprungligen inskrivet av Daniel
[B]haftigatecken.xml

<?xml version="1.0" encoding="utf-8"?> <test> <title>å, ä, ö</title> <saker>mm</saker> </test>

Det är ingen valid XML, UTF-8 får inte innehålla å, ä, ö.

Öppnar du den i en XML editor, eller Internet Explorer för den delen ser du att det blir fel...

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av formatckolon
Det är ingen valid XML, UTF-8 får inte innehålla å, ä, ö.

Öppnar du den i en XML editor, eller Internet Explorer för den delen ser du att det blir fel...

/Anders

Nu pratar du strunt. Unicode kan innehålla våra svenska tecken, åäö, samt tusentals andra tecken.

Nu kommer Conios lilla pedagogiska mini-genomgång om teckenbehandling. Jag är dock ingen expert på teckenlära men i stort ska det vara rätt.

Ett tecken är just ett tecken som kan användas i ett språk. Typiska sådana är bokstäver i alfabet, siffror men även andra saker som punkter, komman, matematiska operatorer.

Sedan finns det också ett koncept som heter glyfer (korrekt översatt?). Detta handlar om den visuella presentationen av ett tecken. I vissa språk så kan samma tecken representeras olika beroende på vart det är placerat i ett ord t.ex.

En dator databehandlar, det tror jag alla är med på. En dator hanterar tal, och gör operationer på tal. För att kunna databehandla text så måste man helt enkelt bestämma att vissa tal betyder vissa tecken.

En konvention kan till exempel vara A=0, B=1, C=2, a=100,b=101, c=102 osv.

En lista med tal/tecken-översättningar kallas för teckentabell.

Historiskt så hade olika datorplatformar olika teckentabeller. Detta ledde med teknikutvecklingen ganska snabbt till problem när de olika datorplatformarna skulle prata med varandra.

Efter diverse diskusioner och liknande så utkristaliserades två standarder egentligen, ASCII och EBCDIC. Dessa teckentabeller (det finns flera ASCII teckentabeller, beroende på vilka språk/regioner man avser) var från början 7-bitar långa, vilket gjorde att man fick plats med (128 tecken). Dessa blev senare 8-bitar, vilket då dubblar antalet tecken som fick plats i standarden. Detta var till fördel för oss i sverige, då för att den 7-bitars teckentabellen var så knökad så man fick ta bort "viktiga" tecken för att få plats med våra svenska bokstäver. ASCII standarden utgick sedan som mall till en ISO standard.

Nu senare med Internet utspridet runt hela världen så blir det allt mer aktuellt att kunna kommunicera och hantera tecken från allehanda språk. Det gör att med gällande ASCII/ISO teckentabeller så måste man fortfarande göra teckenomvandlingar. Våra grannar en bit till öst, ryssarna kör ju med det krylliska alfabetet. Att integrera det i ett befintligt 8-bitarssystem med sortering och hantering blir minst sagt jobbigt.

Därför tillkom Unicode. Unicode är ett försök till att göra ett teckenutrymme så stort så att i princip alla tecken som behövs för alla levande språk får plats. Jag tror att de senare versionerna av Unicode (4.0+) har ett teckenutrymme på 32-bitar, vilket gör att man får plats med runt fyra miljarder tecken i unicode. Det borde räcka ett tag.

Unicode är därför ganska bra, om alla hanterar unicode så bör vi förhoppningsvis inte få teckenkonverteringsproblem på ett bra tag. Problematiken att hantera vissa språk kan vara svårt nog 8-).

Vän av ordning har dock noterat något som jag skrev två stycken ovan. 32-bitar?!? Det betyder att för dem som använder Unicode så tar all text upp fyra gånger så mycket plats!

Mja, det kan vara så. Unicode definerar en teckentabell som är 32-bitar. Sedan definerar de också ett sätt enkoda tecken. Enkodningen handlar om att omvandla tecken i tabellen till bytes. Den mest populära varianten för att enkoda Unicode är UTF-8.

UTF-8 enkodningen innebär att ett tecken tar upp 1-5 bytes. Engelska tecken tar upp 1 byte, de flesta övriga latinska tecken tar upp två. Det gör att platsförlusten av Unicode blir ganska liten.

Det finns även fler encodningar. Med UTF-16 enkodningen blir varje tecken minst 2 bytes. I UCS-2 så blir varje tecken ALLTID 2 bytes, men då stöds inte de mer obskyra tecknena.

Så tillbaka till Anders svar. Ett UTF-8 enkodat XML-dokument får innehålla åäö, men de får inte finnas i dokumentet enkodat med ISO-8859-1 8-).

//C

Permalänk

conio, du har ju rätt angående encoding och unicode, men har du använt XML någon gång?

Mitt uttalande "UTF-8 får inte innehålla å, ä, ö." var kanske då inte helt korrekt formulerat utan borde vara "UTF-8 kodade XML dokument får inte innehålla teckenen å, ä, ö.".

Så, visst får ett XML dokument i UTF-8 innehålla Svenska tecken, men de får inte skrivas som t.ex. "ä" utan måste då "översättas" till hex-koden, "ä", vilket blir synnerligen jobbigt och rörigt att läsa. Ta en titt på några RSS feeds t.ex. för Aftonbladet, IDG eller SVD så ser du att de kör ISO-8859-1...

För att illustrera problemet, ta denna XML, spara den på din burk och öppna den i valfri XML parser (Internet Explorer duger):

<?xml version="1.0" encoding="UTF-8"?> <utf8_xml> <swe_chars>Detta är svenska tecken, å ,ä ,ö ,Å ,Ä ,Ö</swe_chars> </utf8_xml>

Vad ser du då?
Jo, att den har encoding UTF-8 och följande fel "invalid character was found in text content".

Så, ta denna då istället med ISO-8859-1 kodning:

<?xml version="1.0" encoding="ISO-8859-1"?> <utf8_xml> <swe_chars>Detta är svenska tecken, å ,ä ,ö ,Å ,Ä ,Ö</swe_chars> </utf8_xml>

Vad händer då?
Hmmm... Inget felmeddelande, hur kommer det sig?

Kan du ha fel i dina uttalanden?

Nä, troligtvis har XML Spy och Microsoft med flera inte testat av sina grejer och gjort fel vad det gäller användandet av teckentabeller... eller...?

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem

Hej igen!

Tydligen var jag inte tydlig nog i min förklaring. Nåväl, vi försöker igen 8-).

Citat:

[B]conio, du har ju rätt angående encoding och unicode, men har du använt XML någon gång?

Jag har använt mer XML än vad jag vill tänka på. Kommunikation i allehanda former mot allehanda system med obskyra enkodningar som EBCDIC-varianter och minidatordialekter av teckentabeller som man trodde var utdöda för hundratals år sedan 8-).

Citat:

Ta denna XML, spara den på din burk och öppna den i valfri XML parser (Internet Explorer duger):

<?xml version="1.0" encoding="UTF-8"?> <utf8_xml> <swe_chars>Detta är svenska tecken, å ,ä ,ö ,Å ,Ä ,Ö</swe_chars> </utf8_xml>

Vad ser du då?
Jo, att den har encoding UTF-8 och följande fel "invalid character was found in text content".

Jasså? Då kanske det är något fel på din XML-parser isf.

Mitt tillvägagångssätt är som följer (i Windows 2000)
1) Jag markerar texten i webbläsaren.
2) Jag klistrar in den i Notepad
3) Väljer spara, "data.xml" som filnamn och UTF-8 som enkodning.
4) Öppnar den i Internet Explorer och ser ett fint minimalt XML-dokument med svenska tecken.

Citat:

Så, ta denna då istället med ISO-8859-1 kodning:

<?xml version="1.0" encoding="ISO-8859-1"?> <utf8_xml> <swe_chars>Detta är svenska tecken, å ,ä ,ö ,Å ,Ä ,Ö</swe_chars> </utf8_xml>

Vad händer då?

Om jag går tillväga på samma sätt som ovan fast i steg tre väljer ANSI (ISO) enkodning så får jag upp ett XML-dokument med samma textuella innehåll.

Citat:

Hmmm... Inget felmeddelande, hur kommer det sig?

Jo det beror på att xml-deklarationen lägst upp anger vilken text-ENKODNING filen har. Då den är enkodad med UTF-8 i första fallet och enkodningen enligt XML-deklarationen är UTF-8 så visas saker korrekt. Så även i det andra exemplet.

Skulle det till exempel vara skillnad på dem så blir det givetvis fel.

Poängen med hela mitt inlägg ovan var att trots att det handlar om två olika representationer av ett tecken (å behöver 8 bitar i ISO-8859-1 och 16 bitar i UTF-8 som exempel) så är det ändå samma tecken i textsammanhang.

Citat:

Kan du ha fel i dina uttalanden?

Allt är ju möjligt, och man ska vara källkritiskt mot allt som skrivs på internet, men i det är fallet så nej, jag har inte fel, det är fortfarande fullt möjligt att ha svenska tecken (åäöÅÄÖ) i UTF-8.

Citat:

Nä, troligtvis har XML Spy och Microsoft med flera inte testat av sina grejer och gjort fel vad det gäller användandet av teckentabeller... eller...?

Nej de har inte gjort fel, du feltolkar det jag skriver.

//C

Permalänk

Ja-a du... Vad ska jag säga...?

Att använda å,ä,ö i ett UTF-8 XML dokument är inte något jag skulle rekommendera eftersom vi bor i detta land där ISO-8859-1 är den teckentabell så gott som alla använder och således kommer inte svenska tecken att representeras rätt om de öppnas i en UTF-8 kodad XML.

Du kör då uppenbarligen UTF-8 som encoding på din burk eftersom dokumentet ser korrekt ut och fungerar.

Visst, ha å,ä,ö i ett UTF-8 dokument, men se att det blir fel i de allra flesta fall där någon försöker använda det som har regionen satt till ett land med standard ISO-8859-1...

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av madah
Har du prövat använda UTF-8 och även sparat filen med notepad som UTF-8?

Citat:

Ursprungligen inskrivet av Eagleorn
Ja, det har jag gjort, men då försvinner alla å,ä och ö från filen.

Citat:

Ursprungligen inskrivet av conio
Mitt tillvägagångssätt är som följer (i Windows 2000)
1) Jag markerar texten i webbläsaren.
2) Jag klistrar in den i Notepad
3) Väljer spara, "data.xml" som filnamn och UTF-8 som enkodning.
4) Öppnar den i Internet Explorer och ser ett fint minimalt XML-dokument med svenska tecken.

Conio har helt rätt här och det var just detta jag menade med mitt förra inlägg längre upp. Alltså, skriv in encoding="UTF-8" längst upp i xml-filen, skriv in åäö som vanligt och spara filen med Notepad som UTF-8.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av formatckolon
Att använda å,ä,ö i ett UTF-8 XML dokument är inte något jag skulle rekommendera eftersom vi bor i detta land där ISO-8859-1 är den teckentabell så gott som alla använder och således kommer inte svenska tecken att representeras rätt om de öppnas i en UTF-8 kodad XML.

Att använda UTF-8 är väl snarare precis det man borde göra så ofta som möjligt i XML.

Jag citerar från sektion 4.3.3 i Extensible Markup Language (XML) 1.0 (Third Edition) (Specification):

Citat:

All XML processors MUST be able to read entities in both the UTF-8 and UTF-16 encodings.

Med andra ord, de enda två enkodningar som en XML-parser MÅSTE stödja är UTF-8 och UTF-16. Så vill du vara säker på att ditt dokument ska kunna läsas så bör man välja någon enkodning (då UTF-8 generellt västeuropeiskt blir mindre minneskrävande).

Däremot om det gäller en vanlig textfil så är det väldigt sällan jag använder UTF-8, utan då är det snarare ISO-8859-15 (1:an med euro) eller Cp1252 (Windows variant av ISO-8859-1(5), bläh!), men hela tråden handlade om XML.

//C

EDIT: Blev ett extratecken i citeringen, tog bort den.
EDIT2: La till en länk till XML-specen.

Permalänk

Tack! "Däremot om det gäller en vanlig textfil..." det är just det jag pratar om... *suck*

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av formatckolon
Tack! "Däremot om det gäller en vanlig textfil..." det är just det jag pratar om... *suck*

ursäkta att jag lägger mig i erat "bråk", men det har bara talats om xml-filer i den här tråden så vitt jag kan se... det inkluderar dina inlägg också...

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Re: XML character encoding för svenska bokstäver

Citat:

Ursprungligen inskrivet av Eagleorn

Har testat med lite olika, bl.a

  • iso-8859-n (där n står för ett ental) - elementet skrivs ut, men med konstiga bokstäver.

  • utf-8 - ger parse error i XML filen där jag använder svenska bokstäver

  • utf-16 - ger parse error i XML filen där jag använder svenska bokstäver

Detta var den ursprungliga frågan här i tråden, och eftersom tecken tabellerna här beter sig på det sättet drog jag slutsatsen att trådskaparen använder XML:en som vanlig ASCII text fil och det var för denne jag försökte hjälpa tillrätta...

/Anders

Visa signatur

**************************
Om det fungerar för bra, installera om det...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jovnas
ursäkta att jag lägger mig i erat "bråk", men det har bara talats om xml-filer i den här tråden så vitt jag kan se... det inkluderar dina inlägg också...

Jo med tanke på att rubriken nämner XML så är det väl ganska uppenbart 8-).

Jag kanske gled iväg lite på en generell beskrivning av teckenkodning och kom ifrån ämnet lite, det var kanske överdrivet av mig.

Jag försöker bara vara saklig och framstår jag som bråkig/bufflig så ber jag om ursäkt, det är inte min avsikt.

//C