VisualStudioプロジェクトのすべてのファイルをUTF-8として保存します


87

Visual Studio2008プロジェクトのすべてのファイルを特定の文字エンコードで保存できるかどうか疑問に思います。混合エンコーディングを使用したソリューションがあり、それらをすべて同じにしたい(署名付きのUTF-8)。

単一のファイルを保存する方法を知っていますが、プロジェクト内のすべてのファイルはどうですか?


1
RCコンパイラ(少なくともVisual Studio 2008まで)はUTF8ファイルをサポートしていないことを知っておく必要があります。これらのファイルにはUTF16を使用する必要があります。
bogdan 2009

また、GlobalSuppressions.csUTF-16です。
DavidRR 2017年

回答:


74

すでにVisualStudioを使用しているので、単にコードを記述してみませんか?

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

たった3行のコード!私はあなたが1分以内にこれを書くことができると確信しています:-)


サブディレクトリについてはどうですか。たくさんの* .csファイルがある「プロパティ」サブディレクトリ?
ローマンスターコフ2009年

3
「SearchOption.AllDirectories」パラメータは、サブディレクトリを含めるために必要なすべてです。それに応じてコードを編集しました。
Timwi 2009年

9
私は今それを試しました、そしてそれはうまくいきます。変更する必要があるのは、スウェーデン語の文字(åäö)を保持するために、ReadAllTextの2番目のパラメーターとしてEncoding.GetEncoding(1252)= Western European(Windows)を使用することだけでした。
jesperlind 2011

38

これはいくつかの助けになるかもしれません。

元の参照がスパムサイトによって改ざんされたため、リンクが削除されました。

短いバージョン:1つのファイルを編集し、[ファイル]-> [詳細保存オプション]を選択します。UTF-8をASCIIに変更する代わりに、UTF-8に変更します。編集:バイトオーダーマーカー(BOM)がないことを示すオプションを選択していることを確認してください

コードページを設定して[OK]をクリックします。現在のファイルを過ぎても持続しているようです。


9
「Unicode(署名なしのUTF-8)」に変更します。変更しないと、ファイルの先頭にBOMが追加されます。
チャックルバット

11
同様に同意しました...誰かが私たちにBOMを設定しました。
トラッカー1 2012

12

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);
    }
}

ファイルはUTF8のままです
-VisualStudioでサインイン

1
Unicode文字は実行後に失われます。たとえば、Üは になり、©は になります。
Der_Meister 2017年

8

たとえばPythonスクリプトを使用して、プログラムで(VSの外部で)ファイルを変換します。

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コードページにあることを前提としています。これは、VS2008も明らかに想定しているものと同じです。一部のファイルのエンコーディングがまだ異なることがわかっている場合は、これらのエンコーディングを指定する必要があります。


5

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;
    }
}

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)

1

VSでTFSを使用している場合:http://msdn.microsoft.com/en-us/library/1yft8zkw(v = vs.100).aspx 例:

tf checkout -r -type:utf-8 src/*.aspx

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

1

このタイプのエラーを回避したい場合:

ここに画像の説明を入力してください

次のコードを使用します。

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は、VisualStudioがファイルを保存するために使用するデフォルトのWindowsエンコーディングです。


1

UTF-8-BOMからUTF-8に変換します

rasxの答え基づいて、現在のファイルがすでにUTF-8でエンコードされている(ただしBOMを使用している可能性がある)と想定し、BOMを使用せずにUTF-8に変換して、既存のUnicode文字を保持する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, [Text.Encoding]::UTF8);
        [Text.Encoding]$e = New-Object -TypeName Text.UTF8Encoding -ArgumentList ($false);
        [IO.File]::WriteAllText($file, $s, $e);
    }
}

0

Visual Studioでこれを自動的に行う方法がない場合にのみ、この提案を提供します(これが機能するかどうかさえわかりません):

  1. プロジェクトに足の不自由なハク(またはVisual StudioをUTF-8としてエンコードするように強制するその他のUnicodeテキスト)という名前のクラスを作成します。
  2. usingMyProject.footの不自由なハク;」を追加します。各ファイルの先頭に。「usingSystem.Text;」のグローバル置換を実行することで、すべてに対してそれを実行できるはずです。「usingSystem.Text ; usingMyProject足の不自由なハク;」を使用します。
  3. すべてを保存します。「UTF-8を使用してX.csを保存しますか?」という長い文字列が表示される場合があります。メッセージか何か。

10
本当にそれを固執させたいのなら、それらの文字でコメントを追加してください。少なくとも、次に誰かが[編集]メニューの[未使用の使用を削除]に移動しても削除されません。
ローマンスターコフ2009年

5
「usingMyProject.footの不自由なハク;」を追加します。各ファイルの先頭に。-質問の主な理由は、各ファイルを個別に開く必要がないことだと思います。
Jenny O'Reilly 2013

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);
 }

0

アイテムはVisualStudio 2017のメニューから削除されます。[ファイル]-> [名前を付けて保存]-> [保存]ボタンの下矢印をクリックして[エンコードで保存...]をクリックすると、引き続き機能にアクセスできます。

必要に応じて、[ツール]-> [カスタマイズ]-> [コマンド]から[ファイル]メニューに追加し直すこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.