Visual Basic 2010 - UTF8 bez BOM   otázka

VB.NET

Zdravim,

potrebujem poradit, pracujem s Visual Basic 2010 a pri ukladani do suboru pomocou

My.Computer.FileSystem.WriteAllText(FileName, Text, False)

mi robi problem kodovanie suboru, potrebujem ho zakodovat do UTF8 bez BOM tak, že keď ho otvorím vidím všetkú diakritiku.

Skúšal som pridať do tej funkciu argument Encoding.ASCII, Encoding.UTF8, Encoding.UTF32, Encoding.Default, ale nič mi nevie proste uložiť súbor tak ako potrebujem.

Neviem teda či je to vôbec možné, ďakujem za všetky rady :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Používá se na to přetížený konstruktor třídy UTF8Encoding ze jmenného prostoru System.Text:

' Vypíše i byte order mask
Dim utf8bom = New UTF8Encoding(True)
Using writer = New System.IO.StreamWriter("C:/bom.txt", False, utf8bom)
  writer.WriteLine("ěščř")
End Using
Using stream = New System.IO.FileStream("C:/bom.txt", System.IO.FileMode.Open)
  Dim buffer = New [Byte](stream.Length - 1) {}
  stream.Read(buffer, 0, CInt(stream.Length))
  MessageBox.Show(String.Join(" ", buffer.[Select](Function(b) String.Format("{0:X2}", b)).ToArray()))
End Using

' Vypíše pouze data
Dim utf8 = New UTF8Encoding(False)
Using writer = New System.IO.StreamWriter("C:/no-bom.txt", False, utf8)
  writer.WriteLine("ěščř")
End Using
Using stream = New System.IO.FileStream("C:/no-bom.txt", System.IO.FileMode.Open)
  Dim buffer = New [Byte](stream.Length - 1) {}
  stream.Read(buffer, 0, CInt(stream.Length))
  MessageBox.Show(String.Join(" ", buffer.[Select](Function(b) String.Format("{0:X2}", b)).ToArray()))
End Using
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vrelá vďaka :) naozaj mi to veľmi pomohlo, a keby som vás ešte mohol poprosiť, skúšam to ešte aj s ASCII kódovaním,

            Dim ascii = New ASCIIEncoding()
            Using writer = New System.IO.StreamWriter(SFD.FileName, False, ascii)

avšak v súbore mi tentoraz neukazuje diakritiku, ale len otázniky. Ak by ste mi ešte mohli s týmto problémom pomôcť, bol by som vám vďačny :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Z MSDN: http://msdn.microsoft.com/en-us/library/... ASCIIEncoding corresponds to the Windows code page 20127. Because ASCII is a 7-bit encoding, ASCII characters are limited to the lowest 128 Unicode characters, from U+0000 to U+007F. If you use the default encoder returned by the Encoding.ASCII property or the ASCIIEncoding constructor, characters outside that range are replaced with a question mark (?) before the encoding operation is performed. Because the ASCIIEncoding class supports only a limited character set, the UTF8Encoding, UnicodeEncoding, and UTF32Encoding classes are better suited for globalized applications.

Jinými slovy, ASCII kódování zahrnuje pouze omezenou znakovou sadu (o 127 znacích), do které se diakritika nevejde. Na Wikipedii http://en.wikipedia.org/wiki/ASCII je přehledná tabulka všech znaků, které se do ASCII vejdou. Pokud se v textu k zakódování vyskytne znak, který nespadá do sady od U+0000 do U+007F, nahradí se ve výstupu zástupným symbolem - otazníkem.

Pokud je přijatelné řešení nahradit ve výstupu diakritiku znaky z ASCII (á na a, ř na r), pak se můžete inspirovat kódem Michala Valáška zde:

http://www.aspnet.cz/articles/92-jak-spo...

Imports System.Globalization
Public Shared Function RemoveDiacritics(s As String) As String
  s = s.Normalize(NormalizationForm.FormD)
  Dim sb As New StringBuilder()
  For i As Integer = 0 To s.Length - 1
    If CharUnicodeInfo.GetUnicodeCategory(s(i)) <> UnicodeCategory.NonSpacingMark Then
      sb.Append(s(i))
    End If
  Next
  Return sb.ToString()
End Function
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ďakujem pekne za všetky rady :)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Možná "by to šlo i bez drátů milý Marconi"

My.Computer.FileSystem.WriteAllText([filename], [string], False, New UTF8Encoding(False))

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback