Gå til innhold

C#: Norske tegn i MS Visual Studio 2005/Csharp/.dotnet


Anbefalte innlegg

Heisann. Jeg prøver å få til et veldig lite og enkelt console-program som skal skrive bl.a. noen norske tegn

til en ASCII-fil(DOS). Det virker overhode ikke!

På skjermen fungerer det omtrent,

//console-output: Hei verden Norske tegn: Æ ? Æ Ø ? Ø Å ? Å

 

men til tekstfila blir det søppel, firkanttegn før det jeg ønsker!

//test.txt : Original: Hei verden Norske tegn: ├å ┬Æ ├å ├ÿ ┬Ø ├ÿ ├à ┬Å ├à

// Encoded: Hei verden Norske tegn: ? ? ? ? ? ? ? ? ?

 

 

Har sjekka FAQ på http://utvikling.com/cppfaq uten å finne noe relevant.

Har også søkt litt og sjekka ut HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSetControl\Nls\CodePage i registry.

satt ACP="1252" og OEMCP="850" (var:1252 og 437).

Programmet bør helst kunne kjøres på forskjellige Windows-XP-boxer uten å modifisere registry også.

Har dere noen tips?

 

using System;

using System.Text;

using System.IO;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

// Æ \x92 \u00C6

// Ø \x9D \u00D8

// Å \x8F \u00C5

String ts = "Hei verden Norske tegn: Æ \x92 \u00C6 Ø \x9D \u00D8 Å \x8F \u00C5";

Console.WriteLine(ts);

System.IO.StreamWriter sw = new System.IO.StreamWriter("test.txt");

sw.WriteLine("Original: " + ts);

ASCIIEncoding ascii = new ASCIIEncoding();

Byte[] encodTS = ascii.GetBytes(ts);

String tsA = ascii.GetString(encodTS);

sw.WriteLine("Encoded: "+tsA);

sw.Close();

sw.Dispose();

}

}

}

 

 

 

 

Er veldig takknemmelig for hjelp!

--

Erik S

Lenke til kommentar
Videoannonse
Annonse

            String ts = "Hei verden Norske tegn: Æ \x92 \u00C6 Ø \x9D \u00D8 Å \x8F \u00C5";
           Console.WriteLine(ts);
           using (FileStream fs = new FileStream("text.txt", FileMode.Create)) {
               byte[] outdata = System.Text.Encoding.Default.GetBytes(ts);
               fs.Write(outdata, 0, outdata.Length);
           }
           using (FileStream fs = new FileStream("text2.txt", FileMode.Create)) {
               byte[] outdata = System.Text.Encoding.ASCII.GetBytes(ts);
               fs.Write(outdata, 0, outdata.Length);
           }
           using (FileStream fs = new FileStream("text3.txt", FileMode.Create)) {
               byte[] outdata = System.Text.Encoding.UTF8.GetBytes(ts);
               fs.Write(outdata, 0, outdata.Length);
           }

 

Pleier å holde meg til System.Text.Encoding.Default. Den funker vel på tvers av XP'er.

Endret av wolf5
Lenke til kommentar
  • 2 uker senere...
Pleier å holde meg til System.Text.Encoding.Default. Den funker vel på tvers av XP'er.

 

:D:cool::thumbup:

 

Yesss - Det funket! Tusen takk, jeg har lært masse på dette.

 

mvh. Erik S.

6826102[/snapback]

Er det en spesiell grunn til at du gjør det så utrolig vanskelig?

 

Dersom målet kun er å opprette en simpel .txt fil kan dette gjøres med 2 linjer:

 

using (StreamWriter log = File.AppendText("log.txt"))
               log.WriteLine("ÆØÅæøå");

Endret av Lurifaksen
Lenke til kommentar

Og file output på den koden der gir 14 bytes lang tekst fil med:

ÆØÅæøå

 

Om man sjekker log.Encoding egenskapen så sier den UTF-8 og den er read only. Så det er ikke så enkelt som det. Skriving av vanlig tekst til fil krever tungen beint i munnen på Encoding. Skriving av byte[] er enkelt (for man må nemlig bruke Encoding for å transformer String til byte[]).

Lenke til kommentar

Edit: Fant ut at det faktisk kan gjøres med én eneste linje i .net 2.0:

 

System.IO.File.AppendAllText("fil.txt", "ÆØÅ fønker jå pærfækt!", Encoding.Default);

 

Det fungerer hvis maskinen har europeisk oppsett. Alternativt kan du hard-kode inn Encoding.GetEncoding("Windows-1252"))

 

Vel.. Jeg kjørte nettopp denne koden:

 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {

           using (StreamWriter log = File.AppendText("log.txt"))
           {
               log.WriteLine("ÆØÅæøå");
           }
       }
   }
}

 

Og det resulterte i ÆØÅ.

 

Nå skal jeg innrømme at jeg ikke er helt sikker på hva som avgjør formatet på filen, men kan jo hende instillinger i operativsystemet spiller en rolle? Jeg har engelsk OS med regionale instillinger og slikt på norsk.

 

Edit: Ser at notepad og notepad2 viste ÆØÅæøå, mens wordpad og notepad++ viste andre tegn (er ANSI). MEN, i et annet program jeg har laget, hvor jeg bruker nøyaktig samme 2-linjers kode for å skrive til fil, takler den æøå uten problemer, og filen er UTF-8. Antagelig har jeg en instilling i selve programmet et sted da. Men la merke til at hvis du koverterer filen til UTF-8 etter at den er opprettet, vil det fungere fint.

 

Jeg har i alle fall ikke hatt problemer med æøå ved skriving/lesing fra fil - men over web var det litt vanskeligere...

Endret av Lurifaksen
Lenke til kommentar

jeg har en studd erfaring med at jeg må bruke UTF7 på innlesing av txt-filer jeg mekker i notepad først... Noen som egentlig har en god forklaring til dette?

 

StreamReader sr = new StreamReader(Server.MapPath("~") + "\\myTextFile.txt", System.Text.Encoding.UTF7);

myText.Text = sr.ReadToEnd();

Lenke til kommentar

Vil tro at Encoding.Default også vil fungere fint. Notepad lagrer vel teksten i et UTF7 format kanskje.

 

Den prøver i utgangspunktet å lagre alle bokstaver som 1 byte med data.

 

Dersom du leker deg litt og hiver inn litt andre tegn utenom det vanlige og prøver å lagre så vil du få en melding:

"Denne filen inneholder tegn i Unicode-format som vil gå tapt hvis du lagrer filen som en ANSI-kodet tekstfil. Hvis du vil beholder Unicode-informasjonen, klikker du....."

Lenke til kommentar
  • 2 uker senere...

tekst er ikke så enkelt altid. Vit derfor hva i huleste du har og skal ha, og hva systemene jobber i.

 

Unicode kommer i litt for mange versjoner, men de 3 vanligste...

UTF8, 1 til 4 bytes, alt ettersom

UTF16, 2bytes

UTF32, 4 bytes

 

de 128 første i unicode er likt som klassisk ascii (inneholder ikke æøå siden det tilhører extended ascii version som er opp til 256 tegn). Unicode støtter alle språk, og windows kjører utf16 i bunn default. Det gjør også java. Derfor bruk unicode. Blir ikke krøll i txtfila om man gjør ting riktig, for de fleste editorer leser .txt filer helt fint om det er ascii eller unicode.

 

Ascii har også mange versjoner .... urk....

8859-1 er den versjonen som har æøå, og er faktisk ganske default i mange systemer. Vi var heldig med den i motsetning til grekere og andre luringer som er på en annen ascii tabell. CP1252 er et annet navn på 8859-1 ... de er ikke helt like, men spør du java hva i huleste en bestemt text fil er, så sier den gjerne CP1252 istedet for 8859-1 som er det du trudde det var ....

 

ascii suger - slutt å bruke det for f...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...