Lưu tất cả các tệp trong dự án Visual Studio dưới dạng UTF-8


87

Tôi tự hỏi liệu có thể lưu tất cả các tệp trong dự án Visual Studio 2008 vào một mã hóa ký tự cụ thể hay không. Tôi có một giải pháp với các mã hóa hỗn hợp và tôi muốn làm cho tất cả chúng giống nhau (UTF-8 có chữ ký).

Tôi biết cách lưu các tệp đơn lẻ, nhưng còn tất cả các tệp trong một dự án thì sao?


1
Bạn nên biết rằng trình biên dịch RC (ít nhất là cho đến khi Visual Studio 2008) không hỗ trợ tệp UTF8 - đối với những tệp này, bạn phải sử dụng UTF16.
bogdan 23/12/09

Ngoài ra, GlobalSuppressions.cslà UTF-16.
DavidRR

Câu trả lời:


74

Vì bạn đã ở trong Visual Studio, tại sao không chỉ cần viết mã?

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

Chỉ có ba dòng mã! Tôi chắc rằng bạn có thể viết điều này trong vòng chưa đầy một phút :-)


Điều gì về thư mục con, ví dụ. vùng phụ "Thuộc tính" có nhiều tệp * .cs?
Roman Starkov

3
Tham số "SearchOption.AllDirectories" là tất cả những gì cần thiết để bao gồm các thư mục con. Tôi đã chỉnh sửa mã cho phù hợp.
Timwi

9
Bây giờ tôi đã thử nó và nó hoạt động tuyệt vời. Điều duy nhất tôi phải sửa đổi là sử dụng Encoding.GetEncoding (1252) = Western European (Windows) làm tham số thứ hai cho ReadAllText để bảo toàn các ký tự Thụy Điển của tôi (åäö).
jesperlind

38

Điều này có thể hữu ích.

liên kết bị xóa do tham chiếu ban đầu bị xóa bởi trang web spam.

Phiên bản ngắn: chỉnh sửa một tệp, chọn Tệp -> Tùy chọn Lưu Nâng cao. Thay vì thay đổi UTF-8 thành Ascii, hãy thay đổi nó thành UTF-8. Chỉnh sửa: Đảm bảo bạn chọn tùy chọn không có byte-thứ tự-đánh dấu (BOM)

Đặt trang mã và nhấn ok. Nó dường như vẫn tồn tại ngay trước tệp hiện tại.


9
Thay đổi nó thành "Unicode (UTF-8 không có chữ ký)", nếu không nó sẽ thêm BOM vào đầu tệp.
Chuck Le Butt

11
Đồng ý là tốt ... ai đó đã thành lập cho chúng tôi BOM.
Tracker1

12

Trong trường hợp bạn cần thực hiện việc này trong PowerShell, đây là động thái nhỏ của tôi:

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

Việc nghỉ tập tin như UTF8-Signed trong visual studio nâng cao tiết kiệm tùy chọn
Jenson nút-sự kiện

1
Các ký tự Unicode bị mất sau khi thực thi. Ví dụ, Ü trở thành và © trở thành .
Der_Meister

8

Tôi sẽ chuyển đổi các tệp theo chương trình (bên ngoài VS), ví dụ: sử dụng tập lệnh 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)

Điều này giả định rằng tất cả các tệp không có trong "UTF-8 có chữ ký" đều nằm trong trang mã ANSI - điều này cũng giống như những gì VS 2008 dường như cũng giả định. Nếu bạn biết rằng một số tệp có các mã hóa khác nhau, bạn sẽ phải chỉ định các mã hóa này là gì.


5

Sử dụng C #:
1) Tạo một ConsoleApplication mới, sau đó cài đặt Mozilla Universal Charset Detector
2) Chạy mã:

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

Tôi đã tạo một chức năng để thay đổi các tệp mã hóa được viết bằng asp.net. Tôi đã tìm kiếm rất nhiều. Và tôi cũng đã sử dụng một số ý tưởng và mã từ trang này. Cảm ơn bạn.

Và đây là chức năng.

  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

Nó có thể được đặt trong tệp .aspx và sau đó được gọi như:

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


1

Cảm ơn các giải pháp của bạn, mã này đã làm việc cho tôi:

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

Nếu bạn muốn tránh loại lỗi này:

nhập mô tả hình ảnh ở đây

Sử dụng mã sau:

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

Mã hóa số 1252 là mã hóa Windows mặc định được Visual Studio sử dụng để lưu tệp của bạn.


1

Chuyển đổi từ UTF-8-BOM sang UTF-8

Dựa trên câu trả lời của rasx , đây là một hàm PowerShell giả định các tệp hiện tại của bạn đã được mã hóa bằng UTF-8 (nhưng có thể với BOM) và chuyển đổi chúng thành UTF-8 mà không có BOM, do đó giữ nguyên các ký tự Unicode hiện có.

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

Tôi chỉ đưa ra đề xuất này trong trường hợp không có cách nào để tự động thực hiện việc này trong Visual Studio (tôi thậm chí không chắc điều này sẽ hoạt động):

  1. Tạo một lớp trong dự án của bạn có tên足 の 不 自由 な ハ ッ キ ン グ(hoặc một số văn bản unicode khác sẽ buộc Visual Studio mã hóa dưới dạng UTF-8).
  2. Thêm "using MyProject.足 の 不 自由 な ハ ッ キ ン グ;" ở đầu mỗi tệp. Bạn có thể làm điều đó trên mọi thứ bằng cách thay thế toàn cục "using System.Text;" với "using System.Text; using MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. Lưu mọi thứ. Bạn có thể nhận được một chuỗi dài "Bạn có muốn lưu X.cs bằng UTF-8 không?" tin nhắn hoặc cái gì đó.

10
Duh, nếu bạn thực sự muốn làm cho nó trở nên hấp dẫn, chỉ cần thêm một bình luận với những ký tự đó. Ít nhất thì nó sẽ không bị xóa vào lần tới khi ai đó chuyển sang "Xóa các mục không sử dụng" trong menu Chỉnh sửa.
Roman Starkov

5
Thêm "using MyProject. 足 の 不 自由 な ハ ッ キ ン グ;" ở đầu mỗi tệp. - Tôi nghĩ lý do chính của câu hỏi là không phải mở từng tệp riêng biệt.
Jenny O'Reilly

0

Các vấn đề mã hóa có kinh nghiệm sau khi chuyển đổi giải pháp từ VS2008 sang VS2015. Sau khi chuyển đổi, tất cả các tệp dự án được mã hóa trong ANSI, nhưng chúng chứa nội dung UTF8 và được tập hợp lại thành tệp ANSI trong VS2015. Đã thử nhiều chiến thuật chuyển đổi, nhưng chỉ có tác dụng với giải pháp này.

 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

mục bị xóa khỏi menu trong Visual Studio 2017 Bạn vẫn có thể truy cập chức năng thông qua File-> Save As -> sau đó nhấp vào mũi tên xuống trên nút Save và nhấp vào "Save With Encoding ...".

Bạn cũng có thể thêm nó trở lại menu Tệp thông qua Công cụ-> Tùy chỉnh-> Lệnh nếu bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.