Simpan semua file dalam proyek Visual Studio sebagai UTF-8

87

Saya ingin tahu apakah mungkin untuk menyimpan semua file dalam proyek Visual Studio 2008 ke dalam pengkodean karakter tertentu. Saya mendapat solusi dengan pengkodean campuran dan saya ingin membuat semuanya sama (UTF-8 dengan tanda tangan).

Saya tahu cara menyimpan satu file, tetapi bagaimana dengan semua file dalam sebuah proyek?

jesperlind
sumber
1
Anda harus tahu bahwa kompiler RC (paling tidak sampai Visual Studio 2008) tidak mendukung file UTF8 - untuk file ini Anda harus menggunakan UTF16.
bogdan
Juga, GlobalSuppressions.csUTF-16.
DavidRR

Jawaban:

74

Karena Anda sudah menggunakan Visual Studio, mengapa tidak langsung menulis kodenya?

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

Hanya tiga baris kode! Saya yakin Anda dapat menulis ini dalam waktu kurang dari satu menit :-)

Timwi
sumber
Bagaimana dengan subdirektori, mis. subdirektori "Properties" dengan banyak file * .cs?
Roman Starkov
3
Parameter "SearchOption.AllDirectories" adalah semua yang diperlukan untuk menyertakan subdirektori. Saya telah mengedit kode yang sesuai.
Timwi
9
Saya sekarang telah mencobanya dan berhasil dengan baik. Satu-satunya hal yang harus saya modifikasi adalah menggunakan Encoding.GetEncoding (1252) = Eropa Barat (Windows) sebagai parameter kedua untuk ReadAllText untuk mempertahankan karakter Swedia saya (åäö).
jesperlind
38

Ini mungkin membantu!

tautan dihapus karena referensi asli dirusak oleh situs spam.

Versi singkat: edit satu file, pilih File -> Advanced Save Options. Alih-alih mengubah UTF-8 menjadi Ascii, ubahlah menjadi UTF-8. Edit: Pastikan Anda memilih opsi yang mengatakan no byte-order-marker (BOM)

Atur halaman kode & tekan ok. Tampaknya tetap ada setelah file saat ini.

Broam
sumber
9
Ubah ke "Unicode (UTF-8 tanpa tanda tangan)", jika tidak maka akan menambahkan BOM ke awal file.
Chuck Le Butt
11
Setuju juga ... seseorang menjebak kami BOM.
Tracker1
12

Jika Anda perlu melakukan ini di PowerShell, inilah langkah kecil saya:

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);
    }
}
rasx
sumber
File tetap sebagai UTF8-Signed in visual studio Opsi penyimpanan lanjutan
jenson-button-event
1
Karakter unicode hilang setelah eksekusi. Misalnya, Ü menjadi dan © menjadi .
Der_Meister
8

Saya akan mengonversi file secara terprogram (di luar VS), misalnya menggunakan skrip 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)

Ini mengasumsikan semua file yang tidak ada dalam "UTF-8 dengan tanda tangan" ada di halaman kode ANSI - ini sama dengan yang tampaknya juga diasumsikan oleh VS 2008. Jika Anda mengetahui bahwa beberapa file memiliki pengkodean yang berbeda, Anda harus menentukan apa pengkodean tersebut.

Martin v. Löwis
sumber
5

Menggunakan C #:
1) Buat Aplikasi Konsol baru, lalu instal Mozilla Universal Charset Detector
2) Jalankan kode:

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;
    }
}
Bruce
sumber
1

Saya telah membuat fungsi untuk mengubah file pengkodean yang ditulis dalam asp.net. Saya banyak mencari. Dan saya juga menggunakan beberapa ide dan kode dari halaman ini. Terima kasih.

Dan inilah fungsinya.

  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

Itu dapat ditempatkan dalam file .aspx dan kemudian disebut seperti:

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

Terima kasih atas solusi Anda, kode ini berhasil untuk saya:

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
Ehsan
sumber
1

Jika Anda ingin menghindari jenis kesalahan ini:

masukkan deskripsi gambar di sini

Gunakan kode berikut ini:

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

Nomor pengkodean 1252 adalah pengkodean Windows default yang digunakan oleh Visual Studio untuk menyimpan file Anda.

Maxime Esprit
sumber
1

Konversi dari UTF-8-BOM ke UTF-8

Berdasarkan jawaban rasx , berikut adalah fungsi PowerShell yang mengasumsikan file Anda saat ini sudah dikodekan dalam UTF-8 (tetapi mungkin dengan BOM) dan mengubahnya menjadi UTF-8 tanpa BOM, oleh karena itu mempertahankan karakter Unicode yang ada.

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);
    }
}
Bruno Zell
sumber
0

Saya hanya menawarkan saran ini jika tidak ada cara untuk melakukan ini secara otomatis di Visual Studio (saya bahkan tidak yakin ini akan berhasil):

  1. Buat kelas dalam proyek Anda bernama足 の 不 自由 な ハ ッ キ ン グ(atau beberapa teks unicode lain yang akan memaksa Visual Studio untuk menyandikan sebagai UTF-8).
  2. Tambahkan "menggunakan MyProject.足 の 不 自由 な ハ ッ キ ン グ;" ke bagian atas setiap file. Anda harus dapat melakukannya di semua hal dengan melakukan penggantian global "using System.Text;" dengan "using System.Text; using MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Simpan semuanya. Anda mungkin mendapatkan string panjang "Apakah Anda ingin menyimpan X.cs menggunakan UTF-8?" pesan atau sesuatu.
MusiGenesis
sumber
10
Duh, kalau memang mau bikin melekat tinggal tambahkan komentar dengan karakter tersebut. Setidaknya itu tidak akan terhapus saat seseorang membuka "Hapus Penggunaan yang Tidak Digunakan" di menu Edit.
Roman Starkov
5
Tambahkan "menggunakan Proyek Saya. 足 の 不 自由 な ハ ッ キ ン グ;" ke bagian atas setiap file. - Saya pikir alasan utama dari pertanyaan tersebut adalah, untuk tidak membuka setiap file secara terpisah.
Krisztián Balla
0

Masalah encoding yang dialami setelah mengonversi solusi dari VS2008 ke VS2015. Setelah konversi, semua file proyek dikodekan dalam ANSI, tetapi berisi konten UTF8 dan digabungkan sebagai file ANSI di VS2015. Mencoba banyak taktik konversi, tetapi hanya berhasil menyelesaikan solusi ini.

 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);
 }
Janis Rudovskis
sumber
0

item dihapus dari menu di Visual Studio 2017 Anda masih dapat mengakses fungsionalitas melalui File-> Save As -> kemudian mengklik panah bawah pada tombol Save dan mengklik "Save With Encoding ...".

Anda juga dapat menambahkannya kembali ke menu File melalui Tools-> Customize-> Commands jika Anda mau.

Yitzhak Weinberg
sumber