TFS+Visual Studioで勝手に文字コードが変換される問題
BOM無しのUTF-8で書かれた複数のソースファイルをVisual StudioからTFSにチェックインしていたが、これをエディタで開いたり別ブランチへマージしたりすると、一部のファイルだけなぜか勝手にShift_JISに変換されてしまい、UTF-8のつもりで扱うと文字化けしてしまうという問題が起きて調査した。
- TFSはエンコードを保持する
- Visual StudioはASCIIコードのみ含むBOM無しのファイルは日本語環境ならShift_JISと認識する
- 問題が起きたファイルは、初回チェックイン時にASCIIコードのみを含みTFSにShift_JISと登録されていたところにUTF-8の日本語を追加していた
- 問題が起きていなかった日本語を含むファイルは、初回チェックイン時から日本語を含んでいてTFS上でUTF-8と登録されていた
このことから、TFS上でShift_JISと誤認識された状態のファイルにUTF-8の2バイト文字を追加しても、TFS上のエンコードは更新されないということが分かり、そのファイルをVisual Studioのエディタで開いたりマージしたりすると自動的にShift_JISに変換されると思われた。TFSからファイルを取得しただけなら変換かからないし、変換されても文字の見た目は変化しないし警告の類も出ないのでとても気が付きにくい。
動作上の問題の他にも、ブラウザからTFS上のソースコード・変更セットを見た時もこのTFS上のエンコードが効くので、実際のエンコードとずれていると日本語コメントとかが文字化けしてしまう。
良い手が見つからなかったので、自動テストでTFSのコマンドを叩いて、指定ディレクトリ以下のソースコードについて、エンコードをチェックするようにして、チェックイン後にもしShift_JISが含まれていたら検出できるようにした。
他には、例えば常に初回のチェックイン時から日本語やおまじないコメントを入れておくような対策を取るか
UTF-8 の文字化け対策! 「美乳」ではなく「†(ダガー)」を使う | 亜細亜ノ蛾
そもそもこのファイルはVisual Studio Code書いたものだったので、そっちから直接チェックインすれば、Visual Studio Code自身は.editorconfigでBOM無しUTF-8だと分かっているのでうまくいくのかもしれない。未確認。