Visual Studio projesindeki tüm dosyaları UTF-8 olarak kaydedin


87

Bir Visual Studio 2008 projesindeki tüm dosyaları belirli bir karakter kodlamasına kaydetmenin mümkün olup olmadığını merak ediyorum. Karışık kodlamalara sahip bir çözümüm var ve hepsini aynı yapmak istiyorum (imzalı UTF-8).

Tek dosyaları nasıl kaydedeceğimi biliyorum, ancak bir projedeki tüm dosyalara ne dersiniz?


1
RC derleyicisinin (en azından Visual Studio 2008'e kadar) UTF8 dosyalarını desteklemediğini bilmelisiniz - bu dosyalar için UTF16 kullanmanız gerekir.
bogdan

Ayrıca GlobalSuppressions.csUTF-16'dır.
DavidRR

Yanıtlar:


74

Zaten Visual Studio'da olduğunuza göre, neden sadece kodu yazmıyorsunuz?

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

Yalnızca üç satır kod! Eminim bunu bir dakikadan daha kısa sürede yazabilirsin :-)


Ya alt dizinler, ör. Çok sayıda * .cs dosyası içeren "Özellikler" alt dizini?
Roman Starkov

3
Alt dizinleri dahil etmek için gereken tek şey "SearchOption.AllDirectories" parametresidir. Kodu buna göre düzenledim.
Timwi

9
Şimdi denedim ve harika çalışıyor. Değiştirmem gereken tek şey, İsveççe karakterlerimi (åäö) korumak için ReadAllText'in ikinci parametresi olarak Encoding.GetEncoding (1252) = Batı Avrupa (Windows) kullanmaktı.
jesperlind

38

Bu biraz yardımcı olabilir.

orijinal referans spam sitesi tarafından tahrif edildiği için bağlantı kaldırıldı.

Kısa sürüm: bir dosyayı düzenleyin, Dosya -> Gelişmiş Kaydetme Seçenekleri'ni seçin. UTF-8'i Ascii olarak değiştirmek yerine UTF-8 olarak değiştirin. Düzenle: Bayt sırası işaretçisi (BOM) yok yazan seçeneği seçtiğinizden emin olun.

Kod sayfasını ayarlayın ve tamam'a basın. Görünüşe göre şu anki dosyayı geçmeye devam ediyor.


9
Bunu "Unicode (imzasız UTF-8)" olarak değiştirin, aksi takdirde dosyanın başına bir BOM ekler.
Chuck Le Butt

11
Aynı fikirde ... birisi bize ürün reçetesini ayarladı.
Tracker1

12

Bunu PowerShell'de yapmanız gerekirse, işte benim küçük hareketim:

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

Dosya, visual studio Gelişmiş kaydetme seçeneklerinde UTF8-Signed olarak kalıyor
jenson-button-event

1
Unicode karakterleri çalıştırıldıktan sonra kaybolur. Örneğin, Ü olur ve © becomes olur.
Der_Meister

8

Dosyaları programlı olarak (VS dışında), örneğin bir Python komut dosyası kullanarak dönüştürürdüm:

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)

Bu, "imzalı UTF-8" de olmayan tüm dosyaların ANSI kod sayfasında olduğunu varsayar - bu, görünüşe göre VS 2008'in de varsaydığı ile aynıdır. Bazı dosyaların henüz farklı kodlamalara sahip olduğunu biliyorsanız, bu kodlamaların ne olduğunu belirtmeniz gerekir.


5

C # kullanarak:
1) Yeni bir ConsoleApplication oluşturun, ardından Mozilla Universal Charset Detector'ı kurun
2) Kodu çalıştırın:

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'te yazılan kodlama dosyalarını değiştirmek için bir işlev oluşturdum. Çok aradım. Ayrıca bu sayfadaki bazı fikirleri ve kodları kullandım. Teşekkür ederim.

Ve işte fonksiyon.

  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 dosyasına yerleştirilebilir ve ardından şöyle çağrılabilir:

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


1

Çözümleriniz için teşekkürler, bu kod benim için çalıştı:

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

Bu tür bir hatadan kaçınmak istiyorsanız:

görüntü açıklamasını buraya girin

Aşağıdaki kodu kullanın:

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 kodlama numarası, dosyalarınızı kaydetmek için Visual Studio tarafından kullanılan varsayılan Windows kodlamadır.


1

UTF-8-BOM'dan UTF-8'e dönüştürme

Bina RasX cevabı burada mevcut dosyalar zaten bu yüzden var olan Unicode karakterleri koruyarak BOM olmadan UTF-8 UTF-8 (ama belki BOM ile) ve dönüşüm bunları kodlanıyor varsayan bir PowerShell işlevidir.

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

Bu öneriyi yalnızca bunu Visual Studio'da otomatik olarak yapmanın bir yolu olmadığında sunuyorum (bunun işe yarayacağından bile emin değilim):

  1. Projenizde足 の 不 自由 な ハ ッ キ ン グ(veya Visual Studio'yu UTF-8 olarak kodlamaya zorlayacak başka bir unicode metin) adlı bir sınıf oluşturun .
  2. "Projem kullanarak.足 の 不 自由 な ハ ッ キ ン グ;" her dosyanın en üstüne. "Using System.Text;" yerine genel bir değişiklik yaparak bunu her şeyde yapabilmelisiniz; "System.Text kullanarak; MyProject kullanarak.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Her şeyi kaydedin. Uzun bir "X.cs'yi UTF-8 kullanarak kaydetmek istiyor musunuz?" Dizesi alabilirsiniz. mesajlar falan.

10
Duh, eğer gerçekten yapışmasını istiyorsanız, sadece bu karakterlerle bir yorum ekleyin . En azından, bir dahaki sefere birisi Düzen menüsünde "Kullanılmayan Kullanımları Kaldır" seçeneğine gittiğinde silinmez.
Roman Starkov

5
"Projem kullanarak. 足 の 不 自由 な ハ ッ キ ン グ;" her dosyanın en üstüne. - Sanırım sorunun ana nedeni, her dosyayı ayrı ayrı açmak zorunda kalmamaktı.
Krisztián Balla

0

Çözümü VS2008'den VS2015'e dönüştürdükten sonra yaşanan kodlama sorunları. Dönüştürmeden sonra tüm proje dosyaları ANSI olarak kodlandı, ancak UTF8 içeriği içeriyordu ve VS2015'te ANSI dosyaları olarak yeniden düzenlendi. Birçok dönüştürme taktiği denedi, ancak yalnızca bu çözümü çalıştı.

 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

öğe, Visual Studio 2017'de menüden kaldırılır. İşlevselliğe Dosya-> Farklı Kaydet -> ve ardından Kaydet düğmesindeki aşağı oka tıklayıp "Kodlamayla Kaydet ..." seçeneğine tıklayarak yine de erişebilirsiniz.

İsterseniz, Araçlar-> Özelleştir-> Komutlar yoluyla da Dosya menüsüne geri ekleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.