09. juli 2010 - 11:00Der er
16 kommentarer og 1 løsning
Streamwriter problem med Æ Ø Å
Hej. Jeg er gået i stå med et problem som jeg virkelig håber jeg kan få hjælp til herinde.
Min opgave er i sidste ende at oprette en XML-fil via enten streamwriter eller xmlwriter (underordnet for mig). Den her XML fil skal så uploades til validering på et site. Mit problem er imidlertid at jeg får en "Invalid byte 2 of 2-byte UTF-8 sequence." ved upload. jeg har identificeret problemet til at jeg får fejlen ved henholdsvis Æ, Ø og Å, men ikke med æ, ø og å, altså kun de store skandinaviske bogstaver.
Jeg har prøvet et hav af forskellige encodings og write metoder, men stadig uden held.
Her hvor jeg er nået til nu er situationen den at hvis jeg opretter en simpel .txt fil, gennem mit program, kun indeholdende karakteren "Ø" og åbner denne .txt fil i UltraEdit, så er den korresponderende hexadecimale værdi "C3 98" og karakteren værdi er "Ø". Dette burde være henholdsvis "D8" og "Ø". hvis jeg gennem windows opretter en text-fil indeholdende karakteren "Ø" og åbner denne i UltraEdit, ser det hele rigtigt ud, men hvis jeg åbner den programmerede udgave af text-filen og prøver at slette "Ø"'et, gemme og skrive "Ø"'et igen, så er det forkert igen.
nedenstående er eksempler på hvordan jeg har prøvet at programmere mig ud af problemet:
Glem det UTF8, det giver kun problemer, hvis ikke ved skrivning så ved læsning.
Brug Windows 1252, sådan her:
new StreamWriter("c:\\4.txt", false, Encoding.GetEncoding(1252)))
UltraEdit læser UTF8 når du har encoded med den jo, du kan ikke gemme ÆØÅ med UTF8 og forvente at de gemmes som de ser ud. Er du i tvivl om encoding, så opklar din forvirring med EditPad Pro, den vil helt sikkert hjælpe dig :)
Er du sikker på, at fejlen ikke ligger i modtagerservicen?
Jeg vil til enhver tid fraråde, at du bruger windows 1252. Hvis du skal skrive til en xml-fil og du fortæller at encodingen er utf-8, skal du også encode i utf-8. Jeg har ikke kunne genskabe dit problem. Hvis jeg afvikler det her:
using System;
namespace B.Testing { class MainClass { public static void Main(string[] args) { using (System.IO.TextWriter tw = new System.IO.StreamWriter("testme.txt", false, System.Text.Encoding.UTF8)) { tw.WriteLine("Ø"); }
} } }
Får jeg en utf-8-encoded fil, med et fint Ø i.
I øvrigt er her god læsning her. Det er helt sikkert noget, især Janus_007 kunne få noget ud af at læse på også:
nedenstående er eksempler på hvordan jeg har prøvet at programmere mig ud af problemet:
Eksempel #4 bør virke, da default encoding er UTF-8.
Her hvor jeg er nået til nu er situationen den at hvis jeg opretter en simpel .txt fil, gennem mit program, kun indeholdende karakteren "Ø" og åbner denne .txt fil i UltraEdit, så er den korresponderende hexadecimale værdi "C3 98" og karakteren værdi er "Ø". Dette burde være henholdsvis "D8" og "Ø".
Med hensyn til UTF-8 versus CP-1252, så må kriteriet være:
skal du overbevise arbejdsgiver om at du er rigtigt skrap til midt i 90'erne teknologi og mener at verden stopper udenfor de vestlige lande => så brug CP-1252
skal du overbevise arbejdsgiver om at du er kommet over år 2000 og at du har hørt om asien => så brug UTF-8
Back in the semi-olden days, when Unix was being invented and K&R were writing The C Programming Language, everything was very simple. EBCDIC was on its way out.
Næste gang jeg støder på problemstillingen skriver jeg lige her på Eksperten, jeg kan ikke udelukke jeg har set mig sur på UTF8. Så må vi få det opklaret en gang for alle :)
Det er klart at det giver problemer hvis noget er i encoding X men fortolkes som om det var i encoding Y - også hvis X er UTF-8, men det betragter jeg ikke som et UTF-8 problem.
jeg har prøvet den foreslåede kode uden success: using (System.IO.TextWriter tw = new System.IO.StreamWriter("testme.txt", false, System.Text.Encoding.UTF8)) { tw.WriteLine("Ø");
Når jeg åbner text filen i EditPad Pro, står den ganske vist som "Ø" med encoding UTF-8, men problemet er der stadig.
Jeg tror at jeg nu kan kredse mit problem/spørgsmål ind til at jeg gerne vil kunne gemme et "Ø" som hex værdien "D8" og ikke "C398" når jeg laver en tekst fil.
Jeg har fået fat i en test-fil indeholdende et "Ø" og når jeg kører den fil gennem validatoren, kommer der ingen fejl what so ever. Forskellen på "Ø"'et i den fil og min fil er hex repræsentationen af "Ø" som er henholdsvis "D8" og "C398"
en anden forskel er at den fild er virker, tilsyneladende er encoded med "iso-8859-1", men når jeg prøver dette, bliver mit "Ø" til en firkant i stedet.
I EditPad Pro kan du under Convert -> TextEncoding afprøve. Prøv eks.vis at skrive æøå, gem filen, skift lidt imellem encodingen under TextEncoding og se hvordan de spiller sammen.
Hvis jeg laver en fil der kun indeholder "Ø", og åbner i EditPad Pro, siger den at encodingen er "UTF-8". Når jeg prøver at ændre encodingen til "iso-8859-1" bliver mit "Ø" til "Ø"
Hvis jeg derimod åbner den fil der virker og fjerner alt andet end "Ø", så der kun er et "Ø" tilbage og gør det samme, siger den at encodingen er "UTF-8" og når jeg prøver at ændre encodingen til "iso-8859-1" forbliver mit "Ø" et "Ø"
Hvis dit mål er at skrive en en file hvor Ø er xD8, så har du fundet den helt rigtige løsning.
Hvis dit mål er at skrive en fil som skal bruges til et eller andet, så har du tilsyneladende fundet en brugbar løsning. Så længde det er en hemmelighed hvad den file skal bruges til, så kan vi ikke sige om det er en god eller en dårlig løsning.
Det lyder iøvrigt meget mystisk at Encoding.GetEncoding("ISO-8859-1") virker men at Encoding.Default og Encoding.GetEncoing(1252) ikke gør.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.