Just nu i M3-nätverket
Gå till innehåll

StreamReader Problem" - Läsa "konstiga" tecken (t.


Nilsson Jonas

Rekommendera Poster

Nilsson Jonas

Hej

Jag håller på med ett program, i VB 2005, där jag använder StreamReader och StreamWriter för att ladda data In/Ut mellan en Textfil och en Listbox... Men jag har ett problem:

 

Hur gör man för att den ska kunna läsa/skriva tecken som är utanför det vanliga engelska alfabetet??? (typ Å Ä Ö)

 

Detta är väldigt störande eftersom att det är väldigt viktigt i mitt program att den datan som laddas in i Listboxen är exakt likadan som i Textfilen...

 

Så jag är väldigt tacksam för goda råd!

 

//Jonas

 

[inlägget ändrat 2006-04-17 23:27:01 av Nilsson Jonas]

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Se till att du skapar din reader så den läser i rätt format. Du kan dock aldrig läsa annat än vad källfilen klarar av att erbjuda, men försök att läsa den i UTF8, vilket är ett format som enbart skapar uni-koder för tecken som inte återfinns i normal ascii. Skapa din reader med encodingen system.Text.Encoding.UTF8

 

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Tack, Anjuna Moon

Men jag har inte programerat så jättemycket... Jag har bara hållit på i ett halvår typ. Så har du något kodexempel?

 

//Jonas

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Ok, om du hittills skapat din reader med ex.

Dim oReader As New System.IO.StreamReader(sPath)

så byter du ut detta med

Dim oReader As New System.IO.StreamReader(sPath, System.Text.Encoding.UTF8)

 

(där sPath är sökvägen till filen du skall läsa)

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

okej.. Tack... ska se om jag får d o fungera, annart hör jag av mig =P

Och, Tack igen:)

//jonas

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Okej... det löste sig, MEN... Nu kan jag öppna filar där tecknena "ÅÄÖ" finns, och jag får upp det korrekt och allt... o jag kan också spara "ÅÄÖ", så det blev bra.. Men nu till det nya problem

 

När jag testade att spara en fil och sedan öppnade den med mitt program igen ser "ÅÄÖ" ut t.ex såhär: "¶,¤,Ã"...

 

 

 

och det blir samma sak i mitt program som winamp...

Vad är fel?!?! (det kanske är nått som inte går att göra åt? isåfall lägger jag ner detta "projektet", om endast var för att lära mig lite)

 

[bild bifogad 2006-04-22 15:09:21 av Nilsson Jonas]

825945_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Hur sparade du filen? Med StreamWriter? Såg du även till att använda UTF8 när du skrev till filen?

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Ja, men det ville sig inte då... =/ Det blev nån "Overload" grej:

Error	3	Overload resolution failed because no accessible [color="#006400"]'New' can be called with these arguments:[/color]
    [color="#006400"]'Public Sub New(path As String, append As Boolean)': Value of type 'System.Text.Encoding' cannot be converted to 'Boolean'.[/color]
    [color="#006400"]'Public Sub New(stream As System.IO.Stream, encoding As System.Text.Encoding)': Value of type 'String' cannot be converted to 'System.IO.Stream'.	C:\Documents and Settings\Jonas Nilsson\Mina dokument\Visual Studio 2005\Projects\Playlistplayer\Playlistplayer\Form1.vb	54	25	Playlist[/color]

 

Eller har jag gjort fel? (det har jag väll antagligen gjort då, eftersom det blir konstigt)

[color="#0000ff"]Dim[/color] sw As [color="#0000ff"]New[/color] StreamWriter(.FileName, System.Text.Encoding.UTF8)

 

Edit: ".FileName" är då SaveFileDialog1.FileName

Men i en såndär With SaveFileDialog1 Grej...

[inlägget ändrat 2006-04-22 15:20:34 av Nilsson Jonas]

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

När du skapar en streamwriter med filnamnet som första parameter så skall den andra parametern vara en boolean som anger om du vill öppna med append eller ej. Encoding kommer som tredje parameter.

 

Öppna utan append (dvs. skriv över befintlig data om filen redan existerar)

Dim o As New StreamWriter(sFilnamn, False, System.Text.Encoding.UTF8)

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

åååh.. Tänkte att det skulle vara nått sånt.. men jag skulle bara fråga först... jag ska testa det nu...

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Asså jag börjar störa mig rejält på detta =(... nu blev filen jag skrev till helt tom istället =/

och jag la in coden som du sa:

Dim sw As New StreamWriter(.FileName, False, System.Text.Encoding.UTF8)

 

Har du nån ide?

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

koden?

 

    Private Sub Spara_plfil()
       Try
           With SaveFileDialog1
               .FileName = (PlName)
               .Filter = "Playlist filer (*.m3u)|*.m3u"
               If .ShowDialog() = DialogResult.OK Then
                   FileName = .FileName
                   Dim sw As New StreamWriter(.FileName, False, System.Text.Encoding.UTF8)

                   Count = ListBox1.Items.Count
                   For Count = 0 To ListBox1.Items.Count - 1
                       sw.WriteLine(ListBox1.Items.Item(Count))
                   Next
                   PlName = (.FileName)
                   Me.Text = "Playlist Manager" & " - " & (PlName)
               End If
           End With
       Catch es As Exception
           MessageBox.Show(es.Message)
       End Try
   End Sub

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Du måste stänga din stream,sw.Close(), när du är klar med den för att skriven data skall flush:as till filen (alternativt att du explicit kör en sw.Flush efter varje skrivoperation, eller sätter skrivarens AutoFlush till true, sw.AutoFlush=True)

 

 

 

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Okej.. tack, nu gick detta iallafall... men det är ett problem kvar (KOLLA BILD)

 

I Winamp/WMP ser fortvarande Å,Ä,Ö ut såhär: ¶,¤,Ã...

Vilket resulterar i att winamp/WMP inte hittar filen

 

[bild bifogad 2006-04-22 16:04:05 av Nilsson Jonas]

[inlägget ändrat 2006-04-22 16:07:14 av Nilsson Jonas]

826004_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Testade precis själv att skapa en spellista och Winamp gillar varken Unicode eller UTF8. Jag gick då vidare och testade att sätta encoding till Default, och då gick det bra (då skapades en Ansi-fil med aktuella värden för å,ä,ö korrekta, förmodligen styrda av datorns språkinställningar)

 

Således, på både läsare och skrivare använd:System.Text.Encoding.Default

 

EDIT: Jag måste säga att jag själv tycker att teckenkodning är en helvetisk djungel, speciellt då hur ascii-koder över 128 varierar med andra inställningar. Det vore trevligast om alla system använde UTF8 och Unicode istället.

[inlägget ändrat 2006-04-22 16:22:31 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Nilsson Jonas

Okej.. tack.. jag ska pröva samma sak... Och tack för att du orkar slösa din tid på mig =D

 

 

 

Länk till kommentar
Dela på andra webbplatser

  • 1 year later...

Hej

----

Jag ver inte om du har löst detta än. Men vad jag kan se är du felunderrättad, default Encoding för StreamReader och StreamWriter är UTF-8 och denna kovertering fungerar ej för våra svenska specialtecken.

Utan vad du skall använda är ANSI.

 

På detta sätt gjorde jag.

Encoding ANSI = Encoding.GetEncoding(1252); //1252 = ANSI

FileStream oStream = new FileStream(fileIdRow.FtpFileName, FileMode.Create, FileAccess.Write);

StreamWriter streamWriter = new StreamWriter(oStream, ANSI);

FileStream iStream = new FileStream(fileIdRow.CardFileName, FileMode.Open, FileAccess.Read);

StreamReader streamReader = new StreamReader(iStream, ANSI);

 

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
Men vad jag kan se är du felunderrättad, default Encoding för StreamReader och StreamWriter är UTF-8

Det stämmer som du säger att UTF8 numer är default-kodning. Jag har jobbat rätt länge med Net 1.1 och använde denna som källa och där användes inte UTF8 som default (nu har jag iofs inte referensen för Net 1.1 tillgänglig här och hittar den heller inte på MS, men jag är tämligen säker på detta)

 

Däremot har du totalt fel vad gäller att UTF8 inte skulle hantera svenska tecken. Det är ju precis för alfabet med bokstäver (och tecken) som inte existerar i den nedre halvan av ascii-tabellen som UTF8 skapades. UTF8 kommer att ta över den här djungeln av varierande ansi-kodsidor för olika språk så det är verkligen ingen bra ide att rekommendera folk att fortsätta använda dessa.

 

 

 

Länk till kommentar
Dela på andra webbplatser

fil med tecken "ÅÄÖ åäö abcABC" ger med UTF-8 i utskriftsfil " abcABC"

Encoding.Default ger "ÅÄÖ åäö abcABC"

Encoding.ANSI ger "ÅÄÖ åäö abcABC"

 

Jag arbetar med danska, norska och svenska namn och platser i samma fil. Jag har även ett program, som kan ge vägledning i Notepad++ på

http://sourceforge.net/ som kan ställas om i olika format.

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
fil med tecken "ÅÄÖ åäö abcABC" ger med UTF-8 i utskriftsfil " abcABC"

Självklart måste du se till att själva textfilen är sparad i UTF8 såväl som att textströmmen till den är kodad i UTF8. Eftersom bokstäver och tecken i UTF8-kodning är av variabel byte-längd så är det extremt viktigt att inget led i processen vad gäller såväl skapande, redigering, läsning och övrig presentation av texten tappar denna kodning.

 

Det är inget magiskt med det, man måste bara göra det på rätt sätt och du har tappat något steg på vägen om du inte får till det. Jag föreslår att du läser vidare om detta.

http://en.wikipedia.org/wiki/Utf-8

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...