Visual Studio2008プロジェクトのすべてのファイルを特定の文字エンコードで保存できるかどうか疑問に思います。混合エンコーディングを使用したソリューションがあり、それらをすべて同じにしたい(署名付きのUTF-8)。
単一のファイルを保存する方法を知っていますが、プロジェクト内のすべてのファイルはどうですか?
Visual Studio2008プロジェクトのすべてのファイルを特定の文字エンコードで保存できるかどうか疑問に思います。混合エンコーディングを使用したソリューションがあり、それらをすべて同じにしたい(署名付きのUTF-8)。
単一のファイルを保存する方法を知っていますが、プロジェクト内のすべてのファイルはどうですか?
GlobalSuppressions.cs
UTF-16です。
回答:
すでに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分以内にこれを書くことができると確信しています:-)
これはいくつかの助けになるかもしれません。
元の参照がスパムサイトによって改ざんされたため、リンクが削除されました。
短いバージョン:1つのファイルを編集し、[ファイル]-> [詳細保存オプション]を選択します。UTF-8をASCIIに変更する代わりに、UTF-8に変更します。編集:バイトオーダーマーカー(BOM)がないことを示すオプションを選択していることを確認してください
コードページを設定して[OK]をクリックします。現在のファイルを過ぎても持続しているようです。
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);
}
}
たとえば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も明らかに想定しているものと同じです。一部のファイルのエンコーディングがまだ異なることがわかっている場合は、これらのエンコーディングを指定する必要があります。
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;
}
}
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)
あなたの解決策をありがとう、このコードは私のために働いた:
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
このタイプのエラーを回避したい場合:
次のコードを使用します。
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エンコーディングです。
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);
}
}
Visual Studioでこれを自動的に行う方法がない場合にのみ、この提案を提供します(これが機能するかどうかさえわかりません):
ソリューションを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);
}
アイテムはVisualStudio 2017のメニューから削除されます。[ファイル]-> [名前を付けて保存]-> [保存]ボタンの下矢印をクリックして[エンコードで保存...]をクリックすると、引き続き機能にアクセスできます。
必要に応じて、[ツール]-> [カスタマイズ]-> [コマンド]から[ファイル]メニューに追加し直すこともできます。