[스크랩] Visual studio 2010 에서 소스파일을 UTF-8 로 자동변환

Unity3D/Problems 2013. 8. 6. 10:13
반응형

 

참조: http://nving.tistory.com/66

 

Visual C++ 10은 기본적으로 ASCII 인코딩으로 파일을 만든다. (VC#은 기본적으로 유니코드 파일로 생성된다는거 같다)

근데 이게 git와 함께 쓰이면 gitweb 등에서 한글이 깨져보이는 현상이 발생하는데 이는 gitweb이 UTF-8 인코딩을 기본 인코딩으로 보여주기때문이다.

이를 위해 소스파일들의 인코딩을 변경해줘야되는데 메뉴의 File -> Advanced Save Options에서 Encoding을 UTF-8로 변경해야하는 번거로움을 감수해야한다.

그만좀 보고싶다.

 


프로그래머의 힘은 자동화다. 언제까지 이 노가다를 할텐가?
자동화 방법은 다음과 같다.

매크로 에디터에 들어가 EnviromentEvents에서 코드 맨 윗부분의 Module들을 Imports 하는 부분에

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics '여기까지 기존 모듈
Imports System.IO 

위와 같이 System.IO 모듈을 포함시키고 Automatically generated code, do not modify 다음에 다음 코드를 붙여넣고 저장한다.


Sub MakeUTF8File(ByVal path As String)
    Dim input As New FileStream(path, FileMode.Open)

    'Check BOM
    Dim isUTF8 As Boolean = (input.ReadByte = &HEF And input.ReadByte = &HBB And input.ReadByte = &HBF)
    input.Close()

    If (Not isUTF8) Then
        Dim s As String
        s = File.ReadAllText(path, System.Text.Encoding.Default)
        File.WriteAllText(path, s, System.Text.Encoding.UTF8)
    End If
End Sub

Public Sub DocumentEvents_DocumentSaved(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
    Dim path As String = Document.FullName
    MakeUTF8File(path)
End Sub

'이 핸들러는 왠만하면 빼는게 좋다. 라이브러리 파일들을 디버깅 차원에서 열때 자동으로 바꿔버리면 조금 곤란할듯
Public Sub DocumentEvents_DocumentOpening(ByVal path As String, ByVal flag As Boolean) Handles DocumentEvents.DocumentOpening
    MakeUTF8File(path)
End Sub 
이제 다음과 같은 상황에서 파일이 UTF-8 인코딩으로 자동변환이 된다.

1. 파일을 열때
2. 파일을 생성 (생성할때 자동으로 열리니까)
3. 파일을 저장할때

이제 UTF-8 BOM과 함께하는(?) 코딩을 하면 된다.

추가내용1: 
@waan26
님이 알려주신 새파일 생성시 UTF-8을 적용하는 좀 더 좋은 방법이 있다. (C++ Class 생성에는 안먹힌다)
위 방법을 사용시 새 파일을 생성하면 파일 변환이 변환됬다는 메세지 박스가 무조건 뜨게 되는데 (파일 로딩 후에 변환을 시도하는거 같다)
새 파일 생성시 무조건 UTF-8 파일을 생성하는 좀 더 깔끔한 해법으로 다음과 같은 방법이 있다.

1. Visual Studio 설치된 위치(보통 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcprojectitems)에 간다.
2. hfile.h, newc++file.cpp 과 같은 템플릿 파일의 인코딩을 UTF-8로 변경한다
3. 그 뒤로는 항상 UTF-8 파일이 생성된다.

추가내용2:  클래스 템플릿을 따로 만드는 방법도 있다. 이건 좀 있다가 해보고 적어야지 [...]

P.S. 그건 그렇고 코드를 이쁘게 보여줘야되는데.. ( --) 

 

 

 

참조: http://clairehjl.blogspot.kr/2013/05/visual-studio-mono-develop.html

 

개인적으로 MS Visual Studio가 편하기 때문에 주로 VS로 소스코드를 작성하고 있다. 하지만 Unity에서 디버깅을 하기 위해선 Mono 역시 버릴 수 없는 상황인지라.. 두 에디터를 동시에 사용하고 있는데.. 두 에디터의 소스코드 저장방식이 달라 몇가지 불편한 점이 있다.

<Line Einding 방식>
Visual Studio : Windows (CR LF)
Mono : Unix (LF)

<소스코드 인코딩 방식>
Visual Studio : Korean - Codepage 949
Mono : UTF-8

위와 같이 되어있기때문에 VS에서 한글 주석을 달으면 Mono에서 한글이 깨져나오게 된다.
그래서 한가지 방식으로 통일하였는데.. 대부분 Unity 에디터에서 파일을 생성하기 때문에 Mono방식으로 통일하기로 했다.
또한 Codepage 949 방식은 MS가 개발한 한글 인코딩 방식으로 EUC-KR과 비슷한 방식이다. 하지만 Mono에서는 Codepage 949 형식을 지원하지 않기때문에 충돌이 날 수 있다.

결론은 UTF-8방식으로 인코딩을 설정하면 된다.

VS에서 설정을 바꾸려면 프로젝트가 열린 상태에서

FILE > Advanced Save Options 에서 Encoding: Unicode (UTF-8 with signature) - Codepage 65001
Line endings: Unix(LF)

p.s: 인터넷 서핑하다 발견한 한가지 사실: Unix(LF)로 저장할시 Visual Studio에서 break point가 잘 안 잡힐 수 있다고 한다. 내경우엔 현재 VS로 디버깅 할 일이 없어.. 그냥 쓰기로 함.

위와 같이 설정하더라도 매번 소스파일을 생성할때 기본값으로 생성되므로 매크로를 이용해 UTF-8파일을 생성하고 싶다면 아래 링크를 참고하면 될 것 같다. 

반응형
: