2011-12-20 34 views
0

你好我创建在vb.net一个简单的控制台应用程序,以便将文件从任何类型UTF8转换,但我无法弄清楚这件事情如何与编码工作。我知道源文件是Unicode格式的,但是当我将它转换为新格式时,我得到了垃圾。有什么建议么?我不知道如果我的代码是正确的从任何类型的转换CSV文件,以UTF-8

这是我的代码。

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 
+0

Unicode是一种_specification_,不编码。你的源文件使用什么编码? UTF-8? UTF-16? UCS2? ... – fge 2011-12-20 13:59:20

+0

UTF-8也是unicode :-)我把它拿来,然后输入文件是UTF-16? – 2011-12-20 14:02:03

+0

我现在很困惑:S Unicode是一个spesification。 UTF-8是编码,但UTF-8也是统一:就是我的一切混合起来,现在 – themis 2011-12-20 14:09:33

回答

1

的StreamReader有constructor接受一个编码,如果你知道文件的编码,你会传递到StreamReader的

的构造
objReader = New StreamReader(filepath, Encoding.UTF32) 

编辑

您在评论该文件说从Wikipedia

编码为UCS-2老UCS-2(2字节通用字符集)是一个类似 字符连接编码在1996年7月的 Unicode标准的版本2.0中被UTF-16代替。2它通过 生成一个固定长度的格式,简单地使用代码点作为16位代码单元,并产生与如下结果完全相同的结果: UTF-16在 所有代码点的96.9%的范围内0-0xFFFF,包括已经在那个时候被分配一个 值的所有字符。

在这种情况下,您可以尝试使用UTF-16在System.Text.Encoding所谓的Unicode这么尝试

objReader = New StreamReader(filepath, Encoding.Unicode) 

FYI Unicode是具有多种编码,包括一个标准的解码

  • UTF-8
  • UTF-16(大尾端)
  • UT F-16(LittleEndian)
  • UTF-32(大尾端)
  • UTF-32(LittleEndian)

对于微软调用UTF-16 Unicode是有点误导,但不准确,UTF-16一种编码可能用于Unicode。

+0

我还是垃圾 – themis 2011-12-20 14:23:03

1

的StreamReader已经假定UTF-8编码,如果你没有在构造函数调用指定它。所以重新编码为utf-8并不能解决您的问题。使用StreamReader(字符串,编码)重载并指定创建文件时使用的编码。如果你不知道它可能是什么,那么Enoding.Default通常是最好的猜测。与编写.csv文件创建者的代码的程序员交谈,以确保。当你做对了,你不再需要这个代码。

+0

这就是我现在正在做的 objReader =新的StreamReader(文件路径,Encoding.UTF8) strContents = objReader .ReadToEnd() '关闭文件 objReader.Close() ' 写在DOS Console.WriteLine(strContents中) Console.WriteLine( “”) 昏暗objWriter作为新System.IO.StreamWriter(filepath.Replace内容(“.csv”,“_encoded.csv”)) objWriter.WriteLine(strContents) objWriter.Close() Console.WriteLine(“Encoding Finished”) 但我仍然得到垃圾 – themis 2011-12-20 14:19:47

+0

你已经知道这个文件没有用UTF-8编码。所以不要在构造函数调用中使用Encoding.UTF8。 – 2011-12-20 14:21:12