Конвертировать файл CSV из любого типа в UTF-8 - PullRequest
0 голосов
/ 20 декабря 2011

Здравствуйте. Я создаю простое консольное приложение на vb.net, чтобы преобразовать файл из любого типа в utf8, но я не могу понять, как эта штука работает с кодировкой.Я знаю, что исходный файл находится в Юникоде, но когда я конвертирую его в новый формат, я получаю мусор.Какие-либо предложения?я не уверен, что мой код правильный

это мой код.

Imports System.IO
Imports System.Text

Module Module1
    Sub Main()
        Console.Write("Please give the filepath (example:c:/tesfile.csv):")
        Dim filepath As String = Console.ReadLine()
        Dim sEncoding As String = DetermineFileType(filepath)
        Dim strContents As String
        Dim strEncodedContents As String
        Dim objReader As StreamReader
        Dim ErrInfo As String
        Dim bString As Byte()
        Try

            'Read the file
            objReader = New StreamReader(filepath)
            'Read untill the end
            strContents = objReader.ReadToEnd()
            'Close The file
            objReader.Close()
            'Write Contents on DOS
            Console.WriteLine(strContents)
            Console.WriteLine("")

            bString = EncodeString(strContents, "UTF-8")
            strEncodedContents = System.Text.Encoding.UTF8.GetString(bString)
            Dim objWriter As New System.IO.StreamWriter(filepath.Replace(".csv", "_encoded.csv"))
            objWriter.WriteLine(strEncodedContents)
            objWriter.Close()
            Console.WriteLine("Encoding Finished")

        Catch Ex As Exception
            ErrInfo = Ex.Message
            Console.WriteLine(ErrInfo)
        End Try        
        Console.ReadKey()
    End Sub

    Public Function DetermineFileType(ByVal aFileName As String) As String
        Dim sEncoding As String = String.Empty

        Dim oSR As New StreamReader(aFileName, True)
        oSR.ReadToEnd()
        ' Add this line to read the file.
        sEncoding = oSR.CurrentEncoding.EncodingName

        Return sEncoding
    End Function

    Function EncodeString(ByRef SourceData As String, ByRef CharSet As String) As Byte()
        'get a byte pointer To the source data
        Dim bSourceData As Byte() = System.Text.Encoding.Unicode.GetBytes(SourceData)

        'get destination encoding 
        Dim OutEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding(CharSet)

        'Encode the data To destination code page/charset
        Return System.Text.Encoding.Convert(OutEncoding, System.Text.Encoding.UTF8, bSourceData)
    End Function
End Module

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

StreamReader имеет конструктор , который принимает кодировку, если вы знаете кодировку файла, вы должны передать ее в конструктор StreamReader

objReader = New StreamReader(filepath, Encoding.UTF32)

EDIT

Вы говорите в комментарии, что файл закодирован как UCS-2 из Википедия

Более старый UCS-2 (2-байтовый универсальный набор символов) является аналогичным кодировка символов, которая была заменена UTF-16 в версии 2.0 Стандарт Unicode в июле 1996 года. 2 Он производит формат фиксированной длины просто используя кодовую точку в качестве 16-битной кодовой единицы и производит точно такой же результат, как UTF-16 для 96,9% всех кодовых точек в диапазон 0-0xFFFF, включая все символы, которым был присвоен значение в то время.

В этом случае вы можете попытаться декодировать, используя UTF-16, который называется Unicode с System.Text.Encoding , поэтому попробуйте

objReader = New StreamReader(filepath, Encoding.Unicode)

FYI Unicode - это стандарт, который имеет различные кодировки, включая

  • UTF-8
  • UTF-16 (BigEndian)
  • UTF-16 (LittleEndian)
  • UTF-32 (BigEndian)
  • UTF-32 (LittleEndian)

Для Microsoft вызов UTF-16 Unicode немного вводит в заблуждение, но не является неточным, UTF-16 - это одна из возможных кодировок для Unicode.

1 голос
/ 20 декабря 2011

StreamReader уже принимает кодировку utf-8, если вы не укажете ее в вызове конструктора.Поэтому перекодирование в utf-8 не может решить вашу проблему.Используйте перегрузку StreamReader (String, Encoding) и укажите кодировку, которая использовалась при создании файла.Если вы понятия не имеете, что это может быть, тогда Enoding.Default обычно является лучшим предположением.Поговорите с программистом, который написал код для создателя файла .csv, чтобы быть уверенным.Когда вы понимаете это правильно, вам больше не нужен этот код.

...