2017-05-19 100 views
0

這是我的函數來轉換文件的編碼。 在轉換之前,我在Notepad ++中打開了該文件,並使用編碼菜單檢查了編碼,它顯示編碼採用UTF 8編碼。我嘗試使用以下函數轉換文件,但它未轉換爲ASCII。
請看看功能。如何將'沒有BOM'文件的編碼更改爲'Windows-1252'編碼文件?

public static void ConvertFileEncoding(string srcFile, Encoding srcEncoding, string tempFile) 
    { 

     try 
     { 
      using (var reader = new StreamReader(srcFile)) 
      using (var writer = new StreamWriter(tempFile, false, Encoding.ASCII)) 
      { 
       char[] buf = new char[1024]; 

       while (true) 
       { 
        int count = reader.Read(buf, 0, buf.Length); 
        if (count == 0) 
        { 
         break; 
        } 
        writer.Write(buf, 0, count); 
       } 
      } 

      System.IO.File.Copy(tempFile, srcFile, true); // Source file is replaced with Temp file 
      DeleteTempFile(tempFile); 

      // TO DO -- Log Sucess Details 
     } 
     catch (Exception e) 
     { 
      throw new IOException("Encoding conversion failed.", e); 

      // TO DO -- Log failure Details 
     } 
    } 

請幫助我理解什麼是錯的一切發生的時候,當我轉換文件沒有BOM到Windows 1252?

+0

這是你想要的,ASCII還是Windows-1252?雖然文件的編碼是由編寫者確定的,但對於多種編碼,輸出可能是相同的。 (不要被你的測試數據所困擾。)讀者只需使用編寫器使用的編碼。 –

+0

當您的Unicode輸入數據包含不在您的目標字符集中的字符時,您希望發生什麼?選擇:替換爲'?',拋出異常,或相信它永遠不會發生。 –

回答

1

使用UTF-8或ASCII編碼時,ASCII值小於128的字符都是相同的。如果你的文件只包含這些文件(很可能),那麼該文件與UTF-8或ASCII相同。

程序不能期望區分這些,因爲它們是相同的。 UTF-8現在非常常用,所以當一個程序除了要猜測的文件內容之外沒有任何信息,並且它想要顯示編碼時,這是一個合理的選擇。

+0

我的要求是將文件的內容導入到SQL表中。 如果文件不在windows - 1252編碼中,導入將會失敗。 –

+0

如果這些假設的檢測算法只是說出他們知道的所有內容,那將是非常好的:例如,該文件可以被編碼爲UTF-8,不帶BOM,Windows-1252,...和ASCII編碼(點擊此處查看完整列表)。 –