I had a problem with loading & decoding UTF-7 data from a CSV file into Silverlight's RADSpreadProcessing. Special characters like 'é' were being flagged as invalid by the Microsoft UTF-8 decoder in Silverlight. WPF on the other hand supports UTF-7 decoding.
With the help of Nikolay Demirev (Telerik support) he pointed me in the right direction with this Microsoft information: Understanding Encodings for Silverlight
Below is the solution that I came up with to auto-identify the encoding and handle UTF-7 encoded CSV files. I hope that it helps others.
With the help of Nikolay Demirev (Telerik support) he pointed me in the right direction with this Microsoft information: Understanding Encodings for Silverlight
Below is the solution that I came up with to auto-identify the encoding and handle UTF-7 encoded CSV files. I hope that it helps others.
Sub ProcessData() Dim FormatProvider = New CsvFormatProvider With FormatProvider With .Settings .Delimiter = "," .Quote = """" .HasHeaderRow = True .Encoding = New System.Text.UnicodeEncoding End With End With Dim Filename As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Telerik Test.csv") Dim WB As Workbook = LoadWB(Filename, FormatProvider) '-- do something with the loaded data... End Sub Function LoadWB(FileName As String, FormatProvider As CsvFormatProvider) As Workbook If Not File.Exists(FileName) Then Throw New FileNotFoundException(String.Format("{0} Not Found.", FileName)) End If Dim WB As Workbook If GetFileEncoding(FileName) Is Encoding.UTF8 Then WB = FormatProvider.Import(GetUTF8(FileName)) Else Using Data As FileStream = New FileStream(FileName, FileMode.Open) WB = FormatProvider.Import(Data) End Using End If Return WB End Function Function GetUTF8(Filename As String) As String Dim encodedBytes() As Byte = File.ReadAllBytes(Filename) Dim enc8 As Encoding = New UTF8Encoding(False, True) Dim decodedString As String = String.Empty Try decodedString += enc8.GetString(encodedBytes, 0, encodedBytes.Length) Catch e As DecoderFallbackException Dim sb As New StringBuilder For Each b As Byte In encodedBytes sb.Append(Microsoft.VisualBasic.ChrW(Convert.ToInt32(b))) Next decodedString = sb.ToString() End Try Return decodedString End Function Public Shared Function GetFileEncoding(srcFile As String) As Encoding ' Use Default of Encoding.Default (Ansi CodePage) Dim enc As Encoding = Encoding.UTF8 ' Detect byte order mark if any - otherwise assume default Dim buffer As Byte() = New Byte(4) {} Dim file As New FileStream(srcFile, FileMode.Open) file.Read(buffer, 0, 5) file.Close() If buffer(0) = &HEF AndAlso buffer(1) = &HBB AndAlso buffer(2) = &HBF Then enc = Encoding.UTF8 ElseIf buffer(0) = &HFF AndAlso buffer(1) = &HFE Then enc = Encoding.Unicode ElseIf (buffer(0) = &HFE AndAlso buffer(1) = &HFF) Then enc = Encoding.BigEndianUnicode ElseIf buffer(0) = 0 AndAlso buffer(1) = 0 AndAlso buffer(2) = &HFE AndAlso buffer(3) = &HFF Then enc = Encoding.Unicode ElseIf buffer(0) = &H2B AndAlso buffer(1) = &H2F AndAlso buffer(2) = &H76 Then enc = Encoding.UTF8 End If Return enc End Function