2010-11-13 13 views
2
foreach (var f in new DirectoryInfo(@"...").GetFiles("*.cs", SearchOption.AllDirectories)) { 
    string s = File.ReadAllText(f.FullName); 
    File.WriteAllText (f.FullName, s, Encoding.UTF8); 
} 

但轉換字符時被破壞。我怎樣才能防止čćžšđ不會被摧毀?將文件轉換爲utf-8但字符被破壞

手動我fisrt複製文本,然後將文件轉換爲utf-8和粘貼文本回來和字符都可以。但在這裏我有超過200個文件,這太多了。

回答

4

使用File.ReadAllText時,請確保您正在使用正確的編碼讀取文件。例如用ASCII文件:

string s = File.ReadAllText(f.FullName, Encoding.ASCII); 

的價值將得到「毀」在閱讀的時候,如果你使用的是不正確的編碼。

您可以使用代碼頁ID正確的代碼頁創建一個新的Encoding(見this頁的ID):

var myEncoding = new Encoding(10081); // for Turkish (Mac) 
string s = File.ReadAllText(f.FullName, myEncoding); 
1

你將不得不使用File.ReadAllText(字符串,編碼)超載。這個編碼應該是不可能從你的問題中推導出來的,但是不像ReadAllText(string)重載會使用utf-8那樣。試試這個:

string s = File.ReadAllText(f.FullName, Encoding.Default); 

它使用你的機器的默認代碼頁。如果源代碼文件沒有在您的機器上創建,那麼找出文件來自的機器的代碼頁。

0

轉換目錄ANSI所有的文件爲UTF-8

Github Project

String[] files = System.IO.Directory.GetFiles(fbd.SelectedPath, "*.txt" , System.IO.SearchOption.AllDirectories); 

      foreach (var file in files) 
      { 

        byte[] ansiBytes; 
        using (var reader = new System.IO.StreamReader(file, true)) 
        { 
          ansiBytes = File.ReadAllBytes(file); 
        } 
        if (!IsUTF8Bytes(ansiBytes)) 
        { 
         System.IO.File.Move(file, file + "_"); 
         var utf8String = Encoding.Default.GetString(ansiBytes); 
         File.WriteAllText(file, utf8String); 
        } 

      } 







    private static bool IsUTF8Bytes(byte[] data) 
    { 
     int charByteCounter = 1; 
     byte curByte; 
     for (int i = 0; i < data.Length; i++) 
     { 
      curByte = data[i]; 
      if (charByteCounter == 1) 
      { 
       if (curByte >= 0x80) 
       { 
        while (((curByte <<= 1) & 0x80) != 0) 
        { 
         charByteCounter++; 
        } 

        if (charByteCounter == 1 || charByteCounter > 6) 
        { 
         return false; 
        } 
       } 
      } 
      else 
      { 
       if ((curByte & 0xC0) != 0x80) 
       { 
        return false; 
       } 
       charByteCounter--; 
      } 
     } 
     if (charByteCounter > 1) 
     { 
      throw new Exception("Error byte format"); 
     } 
     return true; 
    }