2008-11-11 184 views
73

我想知道是否可以將Visual Studio 2008項目中的所有文件保存爲特定的字符編碼。我得到了一個混合編碼的解決方案,我想讓它們都一樣(帶簽名的UTF-8)。將Visual Studio項目中的所有文件保存爲UTF-8

我知道如何保存單個文件,但是項目中的所有文件如何?

+1

您應該知道RC編譯器(至少直到Visual Studio 2008)不支持UTF8文件 - 對於這些文件,您必須使用UTF16。 – bogdan 2009-12-23 12:32:53

+0

此外,[`GlobalSuppressions.cs`](http://stackoverflow.com/q/33614568/1497596)是UTF-16。 – DavidRR 2017-01-05 14:05:26

回答

61

由於您已經在Visual Studio中,爲什麼不直接簡單地編寫代碼呢?

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

只有三行代碼!我敢肯定,你可以在不到一分鐘:-)

+0

子目錄如何,例如。有很多* .cs文件的「屬性」子目錄? – 2009-05-12 09:21:28

0

我只提供這個建議的情況下,有沒有辦法在Visual Studio自動做到這一點(我什至不知道這會工作):

  1. 在項目中創建一個名爲一類足不自由なハッキング(或其他將迫使Visual Studio編碼爲UTF-8的unicode文本)。
  2. Add「using MyProject。足の不自由なハッキング;」到每個文件的頂部。你應該可以通過全局替換「using System.Text;」來完成所有工作與「使用System.Text;使用MyProject。」足の不自由なハッキング;「。
  3. 保存所有內容。你可能會得到一串「你想用UTF-8保存X.cs嗎?」消息或其他東西。
+10

Duh,如果你真的想讓它堅持只是添加*評論*這些字符。至少在下次有人在「編輯」菜單中選擇「刪除未使用的使用」時它不會被刪除。 – 2009-05-11 22:55:44

+5

添加「使用MyProject。足の不自由なハッキング;」到每個文件的頂部。 - 我認爲問題的主要原因是,不必單獨打開每個文件。 – 2013-07-04 07:53:52

7

我會以編程方式(VS之外)轉換文件,例如,使用Python腳本:

import glob, codecs 

for f in glob.glob("*.py"): 
    data = open("f", "rb").read() 
    if data.startswith(codecs.BOM_UTF8): 
     # Already UTF-8 
     continue 
    # else assume ANSI code page 
    data = data.decode("mbcs") 
    data = codecs.BOM_UTF8 + data.encode("utf-8") 
    open("f", "wb").write(data) 

這是假設所有的文件不在「UTF-8簽名」是在ANSI代碼頁 - 這是同樣的東西VS 2008顯然也是承擔。如果你知道某些文件有不同的編碼,你將不得不指定這些編碼是什麼。

10

寫這篇文章如果你需要做到這一點在PowerShell中,這裏是我的小招:

Function Write-Utf8([string] $path, [string] $filter='*.*') 
{ 
    [IO.SearchOption] $option = [IO.SearchOption]::AllDirectories; 
    [String[]] $files = [IO.Directory]::GetFiles((Get-Item $path).FullName, $filter, $option); 
    foreach($file in $files) 
    { 
     "Writing $file..."; 
     [String]$s = [IO.File]::ReadAllText($file); 
     [IO.File]::WriteAllText($file, $s, [Text.Encoding]::UTF8); 
    } 
} 
1

感謝您的解決方案,這個代碼已經爲我工作:

Dim s As String = "" 
Dim direc As DirectoryInfo = New DirectoryInfo("Your Directory path") 

For Each fi As FileInfo In direc.GetFiles("*.vb", SearchOption.AllDirectories) 
    s = File.ReadAllText(fi.FullName, System.Text.Encoding.Default) 
    File.WriteAllText(fi.FullName, s, System.Text.Encoding.Unicode) 
Next 
36

這可能有一些幫助。

由於原始引用被垃圾網站污損,鏈接被刪除。

短版本:編輯一個文件,選擇文件 - >高級保存選項。將UTF-8更改爲Ascii,而不是將其更改爲UTF-8。 編輯:請確保您選擇說沒有字節順序標記(BOM)的選項

設置代碼頁&點擊確定。它似乎堅持過去目前的文件。

1

我已經創建了一個函數來更改在asp.net中編寫的編碼文件。 我搜索了很多。我還使用了此頁面的一些想法和代碼。謝謝。

這裏是函數。

Function ChangeFileEncoding(pPathFolder As String, pExtension As String, pDirOption As IO.SearchOption) As Integer 

    Dim Counter As Integer 
    Dim s As String 
    Dim reader As IO.StreamReader 
    Dim gEnc As Text.Encoding 
    Dim direc As IO.DirectoryInfo = New IO.DirectoryInfo(pPathFolder) 
    For Each fi As IO.FileInfo In direc.GetFiles(pExtension, pDirOption) 
     s = "" 
     reader = New IO.StreamReader(fi.FullName, Text.Encoding.Default, True) 
     s = reader.ReadToEnd 
     gEnc = reader.CurrentEncoding 
     reader.Close() 

     If (gEnc.EncodingName <> Text.Encoding.UTF8.EncodingName) Then 
      s = IO.File.ReadAllText(fi.FullName, gEnc) 
      IO.File.WriteAllText(fi.FullName, s, System.Text.Encoding.UTF8) 
      Counter += 1 
      Response.Write("<br>Saved #" & Counter & ": " & fi.FullName & " - <i>Encoding was: " & gEnc.EncodingName & "</i>") 
     End If 
    Next 

    Return Counter 
End Function 

它可以放置在.aspx文件,然後叫這樣的:

ChangeFileEncoding("C:\temp\test", "*.ascx", IO.SearchOption.TopDirectoryOnly) 
3

使用C#:
1)創建一個新的ConsoleApplication,然後安裝Mozilla Universal Charset Detector
2)執行命令代碼:

static void Main(string[] args) 
{ 
    const string targetEncoding = "utf-8"; 
    foreach (var f in new DirectoryInfo(@"<your project's path>").GetFiles("*.cs", SearchOption.AllDirectories)) 
    { 
     var fileEnc = GetEncoding(f.FullName); 
     if (fileEnc != null && !string.Equals(fileEnc, targetEncoding, StringComparison.OrdinalIgnoreCase)) 
     { 
      var str = File.ReadAllText(f.FullName, Encoding.GetEncoding(fileEnc)); 
      File.WriteAllText(f.FullName, str, Encoding.GetEncoding(targetEncoding)); 
     } 
    } 
    Console.WriteLine("Done."); 
    Console.ReadKey(); 
} 

private static string GetEncoding(string filename) 
{ 
    using (var fs = File.OpenRead(filename)) 
    { 
     var cdet = new Ude.CharsetDetector(); 
     cdet.Feed(fs); 
     cdet.DataEnd(); 
     if (cdet.Charset != null) 
      Console.WriteLine("Charset: {0}, confidence: {1} : " + filename, cdet.Charset, cdet.Confidence); 
     else 
      Console.WriteLine("Detection failed: " + filename); 
     return cdet.Charset; 
    } 
} 
0

從VS2008轉換解決VS2015後有經驗的編碼問題。轉換後,所有項目文件都以ANSI編碼,但它們包含UTF8內容,並在VS2015中被識別爲ANSI文件。嘗試了很多轉換策略,但只有這個解決方案。

Encoding encoding = Encoding.Default; 
String original = String.Empty; 
foreach (var f in new DirectoryInfo(path).GetFiles("*.cs", SearchOption.AllDirectories)) 
{ 
    using (StreamReader sr = new StreamReader(f.FullName, Encoding.Default)) 
    { 
     original = sr.ReadToEnd(); 
     encoding = sr.CurrentEncoding; 
     sr.Close(); 
    } 
    if (encoding == Encoding.UTF8) 
     continue; 
    byte[] encBytes = encoding.GetBytes(original); 
    byte[] utf8Bytes = Encoding.Convert(encoding, Encoding.UTF8, encBytes); 
    var utf8Text = Encoding.UTF8.GetString(utf8Bytes); 

    File.WriteAllText(f.FullName, utf8Text, Encoding.UTF8); 
} 
1

如果你想避免這種類型的錯誤:

enter image description here

使用此下面的代碼:

foreach (var f in new DirectoryInfo(@"....").GetFiles("*.cs", SearchOption.AllDirectories)) 
      { 
       string s = File.ReadAllText(f.FullName, Encoding.GetEncoding(1252)); 
       File.WriteAllText(f.FullName, s, Encoding.UTF8); 
      } 

編碼數1252是由Visual Studio使用默認的Windows編碼保存你的文件。

0

改編上述版本使其工作。

// important! create a utf8 encoding that explicitly writes no BOM    
var utf8nobom = new UTF8Encoding(false); 
foreach (var f in new DirectoryInfo(dir).GetFiles("*.*", SearchOption.AllDirectories)) 
{ 
    string text = File.ReadAllText(f.FullName); 
    File.WriteAllText(f.FullName, text, utf8nobom); 
} 
相關問題