Visual Studio प्रोजेक्ट में सभी फ़ाइलों को UTF-8 के रूप में सहेजें


87

मुझे आश्चर्य है कि यदि किसी विशिष्ट वर्ण एन्कोडिंग में Visual Studio 2008 प्रोजेक्ट में सभी फ़ाइलों को सहेजना संभव है। मुझे मिश्रित एन्कोडिंग के साथ एक समाधान मिला और मैं उन सभी को एक समान बनाना चाहता हूं (हस्ताक्षर के साथ UTF-8)।

मुझे पता है कि एकल फ़ाइलों को कैसे बचाया जाए, लेकिन किसी परियोजना में सभी फ़ाइलों के बारे में कैसे?


1
आपको पता होना चाहिए कि RC कंपाइलर (जैसा कि कम से कम विजुअल स्टूडियो 2008) UTF8 फ़ाइलों का समर्थन नहीं करता है - इन फ़ाइलों के लिए आपको UTF16 का उपयोग करना होगा।
बोगदान

इसके अलावा, GlobalSuppressions.csयूटीएफ -16 है।
डेविड आरआर

जवाबों:


74

चूंकि आप पहले से ही विजुअल स्टूडियो में हैं, इसलिए सिर्फ कोड ही क्यों लिखें?

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

कोड की केवल तीन लाइनें! मुझे यकीन है कि आप इसे एक मिनट से भी कम समय में लिख सकते हैं :-)


उपनिर्देशिका के बारे में क्या, उदा। बहुत से * .cs फ़ाइलों के साथ "गुण" उपखंड?
रोमन स्टार्कोव

3
"SearchOption.AllDirectories" पैरामीटर सभी उपनिर्देशिकाओं को शामिल करने के लिए आवश्यक है। मैंने तदनुसार कोड संपादित किया है।
टिम्मि

9
मैंने अब इसे आजमाया है और यह बहुत अच्छा है। केवल एक चीज जो मुझे संशोधित करनी थी, वह था एन्कोडिंग का उपयोग करना। GetEncoding (1252) = पश्चिमी यूरोपीय (विंडोज) मेरे सिन पात्रों (åäö) को संरक्षित करने के लिए ReadAllText के दूसरे पैरामीटर के रूप में।
jesperlind

38

यह थोड़ी सहायता हो सकती है।

मूल साइट के स्पैम साइट द्वारा डिफेक्ट होने के कारण लिंक हटा दिया गया।

लघु संस्करण: एक फ़ाइल को संपादित करें, फ़ाइल का चयन करें -> उन्नत सहेजें विकल्प। यूटीएफ -8 को असिसी में बदलने के बजाय, इसे यूटीएफ -8 में बदल दें। संपादित करें: सुनिश्चित करें कि आप उस विकल्प का चयन करते हैं जो कहता है कि कोई बाइट-ऑर्डर-मार्कर (BOM) नहीं है

कोड पृष्ठ सेट करें और ठीक हिट करें। ऐसा लगता है कि वर्तमान फ़ाइल के पिछले हिस्से को ही बनाए रखना है।


9
इसे "यूनिकोड (UTF-8 बिना हस्ताक्षर के)" में बदलें, अन्यथा यह फ़ाइल की शुरुआत में BOM जोड़ देगा।
चक ले बट

11
साथ ही सहमत ... किसी ने हमें BOM सेट किया।
ट्रैकर

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- हस्ताक्षरित के रूप में रहती है उन्नत बचाओ विकल्प
जेन्सन-बटन-घटना

1
निष्पादन के बाद यूनिकोड वर्ण खो जाते हैं। उदाहरण के लिए, बन जाता है और ©, बन जाता है।
डेर_मिस्टर

8

मैं फ़ाइलों को प्रोग्रामेटिक रूप से परिवर्तित कर दूंगा (वीएस के बाहर), उदाहरण के लिए पायथन स्क्रिप्ट का उपयोग करके:

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 हस्ताक्षर के साथ नहीं" एएनएसआई कोड पेज में हैं - यह वही है जो वीएस 2008 जाहिरा तौर पर भी मानता है। यदि आप जानते हैं कि कुछ फाइलों में अभी भी अलग-अलग एनकोडिंग हैं, तो आपको यह बताना होगा कि ये एनकोडिंग क्या हैं।


5

C #:
1 का उपयोग करके एक नया कंसोल बनाएं, फिर मोज़िला यूनिवर्सल चार्जसेट डिटेक्टर
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 आपकी फ़ाइलों को बचाने के लिए विज़ुअल स्टूडियो द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट विंडोज एन्कोडिंग है।


1

UTF-8-BOM से UTF-8 में परिवर्तित करें

रासक्स के उत्तर पर निर्माण , यहां एक PowerShell फ़ंक्शन है जो मानता है कि आपकी वर्तमान फाइलें पहले से ही UTF-8 (लेकिन शायद BOM के साथ) में एन्कोडेड हैं और उन्हें बिना BOM के UTF-8 में कनवर्ट करता है, इसलिए मौजूदा यूनिकोड वर्णों को संरक्षित करता है।

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

मैं केवल इस सुझाव की पेशकश कर रहा हूं कि दृश्य स्टूडियो में स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है (मुझे यकीन नहीं है कि यह काम करेगा):

  1. अपनी परियोजना में namedの 自由 な ハ ッ キ in ン 足 足(या कुछ अन्य यूनिकोड पाठ का नाम दें जो विज़ुअल स्टूडियो को UTF-8 के रूप में सांकेतिक शब्दों में बदलने के लिए मजबूर करेगा) में एक वर्ग बनाएँ ।
  2. "MyProject का उपयोग करके जोड़ें;" ject ject ject ject ject ject ject ject ject ject ; " प्रत्येक फ़ाइल के शीर्ष पर। आपको "System.Text का उपयोग करके" का वैश्विक प्रतिस्थापन करके यह सब कुछ करने में सक्षम होना चाहिए; "System.Text का उपयोग करके, MyProject का उपयोग करके।" ext 不 ext ext ext ext ext ext ext ext ; "।
  3. सब कुछ बचा लो। आपको "क्या आप UTF-8 का उपयोग करके X.cs को बचाना चाहते हैं?" संदेश या कुछ और।

10
Duh, अगर आप वास्तव में इसे छड़ी बनाना चाहते हैं तो बस उन पात्रों के साथ एक टिप्पणी जोड़ें । कम से कम यह अगली बार किसी को संपादित मेनू में "अप्रयुक्त Usings निकालें" नहीं मिलेगा।
रोमन स्टार्कोव

5
"MyProject का उपयोग करके जोड़ें;" ject ject ject ject ject ject ject ject ject ject; " प्रत्येक फ़ाइल के शीर्ष पर। - मुझे लगता है कि प्रश्न का मुख्य कारण प्रत्येक फाइल को अलग से खोलना नहीं था।
जेनी ओ'रिली ने

0

VS2008 से VS2015 में समाधान परिवर्तित करने के बाद अनुभवी एन्कोडिंग समस्याएं। रूपांतरण के बाद सभी परियोजना फाइलों को एएनएसआई में एन्कोड किया गया था, लेकिन उनमें यूटीएफ 8 सामग्री थी और वीएससीसी 5 में एएनएसआई फाइलों के रूप में पुनर्गठित किया गया था। कई रूपांतरण रणनीति की कोशिश की, लेकिन केवल इस समाधान काम किया।

 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 में मेनू से हटा दिया गया है। आप अभी भी फ़ाइल-> इस रूप में सहेजें -> के माध्यम से कार्यक्षमता तक पहुंच सकते हैं और फिर सेव बटन पर नीचे तीर पर क्लिक करके और "एनकोडिंग के साथ सहेजें ..." पर क्लिक करें।

आप टूल-> कस्टमाइज़-> कमांड्स के माध्यम से इसे फ़ाइल मेनू में वापस भी जोड़ सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.