บันทึกไฟล์ทั้งหมดในโครงการ Visual Studio เป็น UTF-8


87

ฉันสงสัยว่าเป็นไปได้ไหมที่จะบันทึกไฟล์ทั้งหมดในโครงการ Visual Studio 2008 ลงในการเข้ารหัสอักขระเฉพาะ ฉันได้รับโซลูชันที่มีการเข้ารหัสแบบผสมและฉันต้องการทำให้มันเหมือนกันทั้งหมด (UTF-8 พร้อมลายเซ็น)

ฉันรู้วิธีบันทึกไฟล์เดียว แต่ไฟล์ทั้งหมดในโปรเจ็กต์ล่ะ


1
คุณควรทราบว่าคอมไพเลอร์ RC (อย่างน้อยที่สุดจนถึง Visual Studio 2008) ไม่รองรับไฟล์ UTF8 สำหรับไฟล์เหล่านี้คุณต้องใช้ UTF16
bogdan

นอกจากนี้ยังGlobalSuppressions.csเป็น UTF-16
DavidRR

คำตอบ:


74

เนื่องจากคุณอยู่ใน Visual Studio แล้วทำไมไม่เพียงแค่เขียนโค้ด

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

โค้ดสามบรรทัดเท่านั้น! ฉันแน่ใจว่าคุณสามารถเขียนสิ่งนี้ได้ภายในเวลาไม่ถึงนาที :-)


ไดเร็กทอรีย่อยเช่น. subdir "Properties" ที่มีไฟล์ * .cs จำนวนมาก?
Roman Starkov

3
พารามิเตอร์ "SearchOption AllDirectories" คือทั้งหมดที่จำเป็นในการรวมไดเร็กทอรีย่อย ฉันได้แก้ไขโค้ดตามนั้น
Timwi

9
ตอนนี้ฉันได้ลองใช้แล้วและได้ผลดีมาก สิ่งเดียวที่ฉันต้องแก้ไขคือใช้ Encoding.GetEncoding (1252) = Western European (Windows) เป็นพารามิเตอร์ที่สองของ ReadAllText เพื่อรักษาอักขระภาษาสวีเดนของฉัน (åäö)
jesperlind

38

นี่อาจช่วยได้บ้าง

ลิงก์ถูกลบออกเนื่องจากข้อมูลอ้างอิงเดิมถูกทำลายโดยไซต์สแปม

เวอร์ชันสั้น: แก้ไขไฟล์เดียวเลือกไฟล์ -> ตัวเลือกการบันทึกขั้นสูง แทนที่จะเปลี่ยน UTF-8 เป็น Ascii ให้เปลี่ยนเป็น UTF-8 แก้ไข: ตรวจสอบให้แน่ใจว่าคุณได้เลือกตัวเลือกที่ระบุว่าไม่มีเครื่องหมายไบต์ใบสั่ง (BOM)

ตั้งรหัสหน้าและกดตกลง ดูเหมือนว่าจะยังคงอยู่เพียงแค่ผ่านไฟล์ปัจจุบัน


9
เปลี่ยนเป็น "Unicode (UTF-8 ที่ไม่มีลายเซ็น)" มิฉะนั้นจะเพิ่ม BOM ที่จุดเริ่มต้นของไฟล์
Chuck Le Butt

11
เห็นด้วยเช่นกัน ... มีใครบางคนตั้ง BOM ให้เรา
Tracker1

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-Signed ใน Visual Studio ตัวเลือกการบันทึกขั้นสูง
jenson-button-event

1
อักขระ Unicode จะหายไปหลังจากการดำเนินการ ตัวอย่างเช่นÜกลายเป็น และ©กลายเป็น
Der_Meister

8

ฉันจะแปลงไฟล์โดยทางโปรแกรม (ภายนอก VS) เช่นใช้สคริปต์ 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)

สิ่งนี้จะถือว่าไฟล์ทั้งหมดที่ไม่ได้อยู่ใน "UTF-8 พร้อมลายเซ็น" อยู่ในหน้ารหัส ANSI ซึ่งเหมือนกับที่ VS 2008 ถือว่าเช่นกัน หากคุณทราบว่าไฟล์บางไฟล์ยังมีการเข้ารหัสที่แตกต่างกันคุณจะต้องระบุว่าการเข้ารหัสเหล่านี้คืออะไร


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

ขอบคุณสำหรับวิธีแก้ปัญหาของคุณรหัสนี้ใช้ได้ผลสำหรับฉัน:

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 เป็นการเข้ารหัส Windows เริ่มต้นที่ Visual Studio ใช้เพื่อบันทึกไฟล์ของคุณ


1

แปลง UTF-8-BOM เป็น UTF-8

จากคำตอบของ rasxนี่คือฟังก์ชัน PowerShell ที่ถือว่าไฟล์ปัจจุบันของคุณเข้ารหัสเป็น UTF-8 แล้ว (แต่อาจใช้ BOM) และแปลงเป็น UTF-8 โดยไม่มี BOM ดังนั้นจึงรักษาอักขระ Unicode ที่มีอยู่

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. สร้างคลาสในโปรเจ็กต์ของคุณที่ชื่อ足の不自由なハッキング(หรือข้อความ Unicode อื่น ๆ ที่จะบังคับให้ Visual Studio เข้ารหัสเป็น UTF-8)
  2. เพิ่ม "โดยใช้ MyProject足の不自由なハッキング;" ที่ด้านบนของแต่ละไฟล์ คุณควรจะสามารถทำได้ทุกอย่างโดยทำการแทนที่ "using System.Text;" ทั่วโลก ด้วย "การใช้ System.Text โดยใช้ MyProject足の不自由なハッキング;"
  3. บันทึกทุกอย่าง คุณอาจได้รับสตริงยาว ๆ "คุณต้องการบันทึก X.cs โดยใช้ UTF-8 หรือไม่" ข้อความหรือบางสิ่งบางอย่าง

10
หากคุณต้องการทำให้มันติดจริงๆเพียงแค่เพิ่มความคิดเห็นด้วยตัวละครเหล่านั้น อย่างน้อยจะไม่ถูกลบในครั้งต่อไปที่มีคนไป "ลบการใช้งานที่ไม่ได้ใช้" ในเมนูแก้ไข
Roman Starkov

5
เพิ่ม "โดยใช้ MyProject 足の不自由なハッキング;" ที่ด้านบนของแต่ละไฟล์ - ฉันคิดว่าสาเหตุหลักของคำถามคือไม่ต้องเปิดแต่ละไฟล์แยกกัน
Krisztián Balla

0

พบปัญหาการเข้ารหัสหลังจากแปลงโซลูชันจาก VS2008 เป็น VS2015 หลังจากการแปลงไฟล์โครงการทั้งหมดถูกเข้ารหัสใน ANSI แต่มีเนื้อหา UTF8 และได้รับการแปลงเป็นไฟล์ ANSI ใน VS2015 ลองใช้กลยุทธ์การแปลงหลายวิธี แต่ใช้ได้เฉพาะวิธีนี้

 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

รายการจะถูกลบออกจากเมนูใน Visual Studio 2017 คุณยังคงสามารถเข้าถึงฟังก์ชันผ่านไฟล์ -> บันทึกเป็น -> จากนั้นคลิกลูกศรลงบนปุ่มบันทึกแล้วคลิก "บันทึกด้วยการเข้ารหัส ... "

คุณยังสามารถเพิ่มกลับไปที่เมนูไฟล์ผ่าน Tools-> Customize-> Commands ได้หากต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.