Збережіть усі файли у проекті Visual Studio як UTF-8


87

Цікаво, чи можливо зберегти всі файли у проекті Visual Studio 2008 у певному кодуванні символів. Я отримав рішення зі змішаними кодуваннями і хочу зробити їх однаковими (UTF-8 з підписом).

Я знаю, як зберегти окремі файли, але як щодо всіх файлів у проекті?


1
Ви повинні знати, що компілятор RC (як мінімум до Visual Studio 2008) не підтримує файли UTF8 - для цих файлів потрібно використовувати UTF16.
богдан

Крім того, 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);
}

Тільки три рядки коду! Я впевнений, що ви можете написати це менш ніж за хвилину :-)


Що стосується підкаталогів, наприклад. підкаталог "Властивості" з великою кількістю * .cs файлів?
Роман Старков

3
Параметр "SearchOption.AllDirectories" - це все, що потрібно для включення підкаталогів. Я відповідно відредагував код.
Тімві

9
Зараз я спробував, і це чудово працює. Єдине, що мені довелося змінити, це використовувати Encoding.GetEncoding (1252) = західноєвропейський (Windows) як другий параметр ReadAllText для збереження моїх шведських символів (ääö).
jesperlind

38

Це може допомогти.

посилання видалено через те, що оригінальне посилання зіпсувало спам-сайт.

Коротка версія: відредагуйте один файл, виберіть Файл -> Додаткові параметри збереження. Замість того, щоб міняти UTF-8 на Ascii, змініть його на UTF-8. Редагувати: переконайтеся, що ви вибрали опцію, в якій не вказано маркер порядку байтів

Встановіть кодову сторінку та натисніть "Ok". Здається, воно зберігається лише поза поточним файлом.


9
Змініть його на "Unicode (UTF-8 без підпису)", інакше він додасть специфікацію на початок файлу.
Чак Ле Батт

11
Також погодився ... хтось призначив нам спеціальну задачу.
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 у 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 (але, можливо, зі спеціальною специфікацією), і перетворює їх на UTF-8 без специфікації, таким чином зберігаючи існуючі символи 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
Дух, якщо ви дійсно хочете, щоб він залишився, просто додайте коментар із цими символами. Принаймні він не буде видалений наступного разу, коли хтось перейде в меню "Видалити невикористані використання".
Роман Старков

5
Додайте "за допомогою MyProject. の の 不 自由 な ハ ッ キ ン グ;" вгорі кожного файлу. - Я думаю, що основною причиною питання було те, що не потрібно відкривати кожен файл окремо.
Jenny O'Reilly

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 Ви все ще можете отримати доступ до функціональних можливостей через Файл-> Зберегти як -> потім клацніть стрілку вниз на кнопці Зберегти та натисніть «Зберегти за допомогою кодування ...».

Ви також можете додати його назад до меню Файл за допомогою Інструменти-> Налаштування-> Команди, якщо хочете.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.