Visual Studio 프로젝트의 모든 파일을 UTF-8로 저장


87

Visual Studio 2008 프로젝트의 모든 파일을 특정 문자 인코딩으로 저장할 수 있는지 궁금합니다. 혼합 인코딩을 사용하는 솔루션이 있으며 모두 동일하게 만들고 싶습니다 (서명이있는 UTF-8).

단일 파일을 저장하는 방법을 알고 있지만 프로젝트의 모든 파일은 어떻습니까?


1
RC 컴파일러 (적어도 Visual Studio 2008까지)는 UTF8 파일을 지원하지 않습니다. 이러한 파일의 경우 UTF16을 사용해야합니다.
bogdan 2009

또한 GlobalSuppressions.csUTF-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);
}

단 3 줄의 코드! 나는 당신이 1 분 안에 이것을 쓸 수 있다고 확신합니다 :-)


예를 들어 하위 디렉토리는 어떻습니까? * .cs 파일이 많은 "Properties"하위 디렉토리?
Roman Starkov

3
"SearchOption.AllDirectories"매개 변수는 하위 디렉토리를 포함하는 데 필요한 모든 것입니다. 그에 따라 코드를 편집했습니다.
Timwi

9
나는 지금 그것을 시도했고 그것은 잘 작동합니다. 내가 수정해야하는 유일한 것은 스웨덴어 문자 (åäö)를 보존하기 위해 ReadAllText의 두 번째 매개 변수로 Encoding.GetEncoding (1252) = Western European (Windows)를 사용하는 것입니다.
jesperlind

38

도움이 될 수 있습니다.

스팸 사이트에 의해 원본 참조가 손상되어 링크가 제거되었습니다.

짧은 버전 : 하나의 파일을 편집하고 파일-> 고급 저장 옵션을 선택합니다. UTF-8을 Ascii로 변경하는 대신 UTF-8로 변경하십시오. 편집 : 바이트 순서 마커 (BOM) 없음이라는 옵션을 선택했는지 확인하십시오.

코드 페이지를 설정하고 확인을 누르십시오. 현재 파일을 지나서 지속되는 것 같습니다.


9
"유니 코드 (서명없는 UTF-8)"로 변경하십시오. 그렇지 않으면 파일 시작 부분에 BOM이 추가됩니다.
Chuck Le Butt

11
동의합니다 ... 누군가 우리에게 BOM을 설정했습니다.
Tracker1 2012

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

파일이 Visual Studio 고급 저장 옵션에서 UTF8 서명으로 유지됩니다
jenson-button-event 2011

1
실행 후 유니 코드 문자가 손실됩니다. 예를 들어, Ü는 가되고 ©는 가됩니다.
Der_Meister

8

예를 들어 Python 스크립트를 사용하여 프로그래밍 방식 (VS 외부)으로 파일을 변환합니다.

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는 Visual Studio에서 파일을 저장하는 데 사용하는 기본 Windows 인코딩입니다.


1

UTF-8-BOM에서 UTF-8로 변환

rasx의 답변바탕으로 현재 파일이 이미 UTF-8 (BOM 포함)으로 인코딩되어 있고 BOM이없는 UTF-8로 변환하여 기존 유니 코드 문자를 보존한다고 가정하는 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, [Text.Encoding]::UTF8);
        [Text.Encoding]$e = New-Object -TypeName Text.UTF8Encoding -ArgumentList ($false);
        [IO.File]::WriteAllText($file, $s, $e);
    }
}

0

Visual Studio에서 자동으로이 작업을 수행 할 수있는 방법이없는 경우에만이 제안을 제공하고 있습니다 (이게 작동할지 확신 할 수 없습니다).

  1. 프로젝트에서足 の 不 自由 な ハ ッ キ ン グ(또는 Visual Studio가 UTF-8로 인코딩하도록 강제하는 다른 유니 코드 텍스트) 라는 클래스를 만듭니다 .
  2. "using MyProject.足 の 不 自由 な ハ ッ キ ン グ;"추가 각 파일의 맨 위에. "using System.Text"를 전역 적으로 대체하여 모든 작업을 수행 할 수 있어야합니다. "using System.Text; using MyProject.足 の 不 自由 な ハ ッ キ ン グ;".
  3. 모든 것을 저장하십시오. "UTF-8을 사용하여 X.cs를 저장 하시겠습니까?"라는 긴 문자열이 표시 될 수 있습니다. 메시지 또는 뭔가.

10
정말 고수하고 싶다면 그 캐릭터들과 함께 코멘트 를 추가하세요 . 적어도 다음에 누군가가 편집 메뉴에서 "사용하지 않는 사용 항목 제거"로 이동하면 삭제되지 않습니다.
Roman Starkov

5
"using MyProject. 足 の 不 自由 な ハ ッ キ ン グ;"을 추가합니다. 각 파일의 맨 위에. -질문의 주된 이유는 각 파일을 개별적으로 열 필요가 없었기 때문이라고 생각합니다.
Jenny O'Reilly

0

솔루션을 VS2008에서 VS2015로 변환 한 후 인코딩 문제가 발생했습니다. 변환 후 모든 프로젝트 파일은 ANSI로 인코딩되었지만 UTF8 콘텐츠를 포함하고 VS2015에서 ANSI 파일로 다시 인식되었습니다. 많은 변환 전술을 시도했지만이 솔루션 만 작동했습니다.

 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의 메뉴에서 제거되었습니다. 파일-> 다른 이름으로 저장-> 저장 버튼의 아래쪽 화살표를 클릭하고 "인코딩으로 저장 ..."을 클릭하여 기능에 계속 액세스 할 수 있습니다.

원하는 경우 도구-> 사용자 지정-> 명령을 통해 파일 메뉴에 다시 추가 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.