【问题标题】:Convert CSV file from any type to UTF-8将 CSV 文件从任何类型转换为 UTF-8
【发布时间】:2011-12-20 13:57:33
【问题描述】:

您好,我正在 vb.net 中创建一个简单的控制台应用程序,以便将文件从任何类型转换为 utf8,但我无法弄清楚这个东西如何与编码一起使用。我知道源文件是 Unicode,但是当我将它转换为新格式时,我得到了垃圾。有什么建议么?我不确定我的代码是否正确

这是我的代码。

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

【问题讨论】:

  • Unicode 是规范,而不是编码。您的源文件使用什么编码? UTF-8? UTF-16? UCS2? ...
  • UTF-8 也是 unicode :-) 我接受它然后输入文件是 UTF-16?
  • 我现在很困惑:S Unicode 是一种规范。 UTF-8 是编码,但 UTF-8 也是 Unicode :S 我现在把所有东西都混在一起了
  • 我有一个 CSV 文件,我用 notepad++ 打开它,然后检查编码并检查“在 UCS-2 little indian 中编码”。我需要这个文件将其转换为 utf-8。问题是,当我在控制台中打印时,一切似乎都很好,但是当我在文件中写入时,它会混淆字符

标签: vb.net console-application


【解决方案1】:

StreamReader 有一个 constructor,如果您知道文件的编码,则该 constructor 应该将其传递给 StreamReader 的构造函数

objReader = New StreamReader(filepath, Encoding.UTF32)

编辑

您在评论中说该文件从Wikipedia 编码为 UCS-2

较旧的 UCS-2(2 字节通用字符集)是一个类似的 在 2.0 版本中被 UTF-16 取代的字符编码 1996 年 7 月的 Unicode 标准。2 它通过以下方式生成固定长度格式 只需将代码点用作 16 位代码单元并产生 对于 96.9% 的所有代码点,结果与 UTF-16 完全相同 范围 0-0xFFFF,包括所有已分配 当时的价值。

在这种情况下,您可以尝试使用在System.Text.Encoding 中称为 Unicode 的 UTF-16 进行解码,因此请尝试

objReader = New StreamReader(filepath, Encoding.Unicode)

仅供参考 Unicode 是一种具有多种编码的标准,包括

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

Microsoft 将 UTF-16 称为 Unicode 有点误导,但并非不准确,UTF-16 是 Unicode 可能的一种编码。

【讨论】:

    【解决方案2】:

    如果您未在构造函数调用中指定它,StreamReader 已经采用 utf-8 编码。因此将其重新编码为 utf-8 无法解决您的问题。使用 StreamReader(String, Encoding) 重载并指定创建文件时使用的编码。如果您不知道它可能是什么,那么 Enoding.Default 通常是最好的猜测。与为 .csv 文件创建者编写代码的程序员交谈以确定。当你做对了,你也不再需要这个代码了。

    【讨论】:

    • 这就是我现在正在做的 objReader = New StreamReader(filepath, Encoding.UTF8) strContents = objReader.ReadToEnd() '关闭文件 objReader.Close() '在 DOS Console.WriteLine 上写入内容(strContents) Console.WriteLine("") Dim objWriter As New System.IO.StreamWriter(filepath.Replace(".csv", "_encoded.csv")) objWriter.WriteLine(strContents) objWriter.Close() Console.WriteLine (“编码完成”),但我仍然得到垃圾
    • 您已经知道该文件不是以 utf-8 编码的。所以不要在构造函数调用中使用 Encoding.UTF8。
    猜你喜欢
    • 1970-01-01
    • 2013-09-12
    • 2018-07-06
    • 2019-02-10
    • 1970-01-01
    • 2020-10-11
    • 2015-04-07
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多