Avatar billede damaskinos Nybegynder
09. juli 2010 - 11:00 Der 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:

1)
string[] lines = { "Ø" };
System.IO.File.WriteAllLines(@"C:\1.txt", lines);

2)
FileInfo t = new FileInfo(@"C:\2.txt");
StreamWriter Tex = t.CreateText();
Tex.WriteLine("Ø");
Tex.Write(Tex.NewLine);
Tex.Close();

3)
System.IO.TextWriter writeFile = new StreamWriter("c:\\3.txt",true, Encoding.Unicode);
writeFile.WriteLine("Ø");
writeFile.Flush();
writeFile.Close();
writeFile = null;

4)
using (StreamWriter writer = new StreamWriter("c:\\4.txt"))
{
    writer.Write("Ø");
}

Det skal siges at jeg har prøvet ASCII, Unicode, UTF8, UTF7, UTF32 og Default uden held.
Avatar billede janus_007 Nybegynder
09. juli 2010 - 12:44 #1
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 :)
Avatar billede damaskinos Nybegynder
09. juli 2010 - 12:50 #2
Nu kan jeg oploade filen uden den giver fejl, men "Ø"'et bliver repræsenteret af en firkant "�" ved både visning i notepad og explorer.
Avatar billede bvli Praktikant
09. juli 2010 - 14:03 #3
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å:

http://www.joelonsoftware.com/articles/Unicode.html
Avatar billede janus_007 Nybegynder
10. juli 2010 - 13:02 #4
Nu har jeg læst den artikel og vil vil dog stadig anbefale 1252 :)
Avatar billede arne_v Ekspert
11. juli 2010 - 04:22 #5
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 "Ø".


Forkert.

Unicode D8 gemmes som 2 bytes i UTF-8 encoding.
Avatar billede arne_v Ekspert
11. juli 2010 - 04:26 #6
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
Avatar billede arne_v Ekspert
11. juli 2010 - 04:33 #7
Iøvrigt mener jeg at Joels artikel er elendig.

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.

så er der vist ikke grund til at læse længere.
Avatar billede janus_007 Nybegynder
11. juli 2010 - 14:14 #8
haha den var sku god, Arne :)

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 :)
Avatar billede arne_v Ekspert
12. juli 2010 - 00:13 #9
UTF-8 bør ikke i sig selv give problemer.

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.

.NET har fremragende UTF-8 support.
Avatar billede damaskinos Nybegynder
12. juli 2010 - 10:45 #10
Det virker stadig ikke hos mig.

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.

jeg håber i kan hjælpe mig.
Avatar billede janus_007 Nybegynder
12. juli 2010 - 11:13 #11
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.
Avatar billede damaskinos Nybegynder
12. juli 2010 - 12:30 #12
Det har jeg prøvet.

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 "Ø"
Avatar billede janus_007 Nybegynder
12. juli 2010 - 19:24 #13
Det er jo ganske interessant.. for mig lyder det som at du tror det er UTF8. Gad vide om det er korrekt?

Hvorfor ændrer du også encodingen? Lav en fil med UTF8, indeholdende æøå, gem den på disken og upload til din uploadservice.
Avatar billede arne_v Ekspert
13. juli 2010 - 03:02 #14
Alt tyder på at dit problem ikke er at skrive filen, men hvordan du sidenhen processer den.

Så jeg tror at du skal forklare lidt om hvad du gør med filen efter at den er skrevet og hvad problemet her består i.
Avatar billede damaskinos Nybegynder
13. juli 2010 - 08:48 #15
Mit problem er netop at skrive filen. Den skriver "Ø" som hex værdi "C398" og ikke "D8".
Avatar billede damaskinos Nybegynder
13. juli 2010 - 10:20 #16
Jeg tror jeg har fixet problemet med følgende linie, det virker som om at det bare spiller nu:

System.IO.TextWriter textWriter = new StreamWriter(str_path, true, System.Text.Encoding.GetEncoding("iso-8859-1"));

Stor tak til jer alle sammen og især blvi der ledte mig den rigtige vej.
Avatar billede arne_v Ekspert
20. juli 2010 - 03:30 #17
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester