VisualStudio2017から(もしくは何かの拍子に?)、C++プロジェクトを新規作成すると、そのソースコードが UTF-16 で保存されるようになっていた。
UTF-16だとSourceTreeやBitBucketなどでソースコードが正しく表示されないという問題があるため、何とかしたいと色々探し回っていたら以下の方法を発見した。
この方法だと、簡単にかつ確実に UTF-8 で保存されるようになる。
方法
プロジェクトフォルダー(もしくはそれより上位のフォルダー)に .editorconfig というファイルを置く。
内容は以下の通り。
root = true
[*.{c,h,cpp,cs}]
end_of_line = crlf
charset = utf-8-bom
trim_trailing_whitespace = false
insert_final_newline = false
[*.rc]
[*.{md,txt}]
[*]
注意
[*]
にutf-8設定を記述してしまうと、リソースファイル(*.rc)もUTF-8化されてしまうため(Editorで直接編集した場合のみ?)、ビルドすら通らなくなってしまう。
そういったトラブルを避けるために、utf-8化するのは .cpp/h に限定している。
参考
補足
VS2019ではボタン1つで .editorconfig を生成できるように なるっぽい なっている。(2019/08/06確認)
https://twitter.com/okazuki/status/1073568778900824064?ref_src=twsrc%5Etfw
おまけ: プロジェクトテンプレート化
Visual Studio 2017でプロジェクトテンプレート作成 - 何でもプログラミング
プロジェクトの新規作成を頻繁に行うならテンプレート化しておいたほうがいいかも。
但し、VS2017のテンプレートのエクスポートでは正しく?エクスポートされないようなので、MyTemplate.vstemplate ファイルを手作業で書き換える必要がある。
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>MyConsoleApplication</Name>
<Description>UTF8</Description>
<ProjectType>VC</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>MyConsoleApplication</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<Icon>__TemplateIcon.ico</Icon>
</TemplateData>
<TemplateContent>
<Project TargetFileName="ConsoleApplication2.vcxproj" File="ConsoleApplication2.vcxproj" ReplaceParameters="true">
<ProjectItem ReplaceParameters="false" TargetFileName="$projectname$.vcxproj.filters">ConsoleApplication2.vcxproj.filters</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="$projectname$.cpp">ConsoleApplication2.cpp</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="stdafx.cpp">stdafx.cpp</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="stdafx.h">stdafx.h</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName="targetver.h">targetver.h</ProjectItem>
<ProjectItem ReplaceParameters="false" TargetFileName=".editorconfig">.editorconfig</ProjectItem>
</Project>
</TemplateContent>
</VSTemplate>
※.cpp/h が全く入っていなかったので追記。さらに、zipファイル内に該当ファイルを追加。