コミットログのエンコーティング指定
PowerShellの$OutputEncodingについての説明を読むと、PowerShellがテキストを他のアプリケーションに渡すときに使用するエンコーディングとなっている。
以下のコマンドの結果からすると、PowerShellがgit logの結果のテキストを受け取るときにどのようになっているかは分からないが、nkf32にはUTF8で渡していることが分かる。
PS C:\repo> git log | nkf32 -g ASCII PS C:\repo> $OutputEncoding = [Text.Encoding]::UTF8 PS C:\repo> git log | nkf32 -g UTF-8
処理結果はというと、やはり文字化けする。nkfの処理結果をPowerShellが表示のエンコーディングであるシフトJISに変換して化けてるのか???
コンソール表示のエンコーディングは以下の通り。
PS C:\repo> [Console]::OutputEncoding BodyName : iso-2022-jp EncodingName : 日本語 (シフト JIS) HeaderName : iso-2022-jp WebName : shift_jis WindowsCodePage : 932 IsBrowserDisplay : True IsBrowserSave : True IsMailNewsDisplay : True IsMailNewsSave : True IsSingleByte : False EncoderFallback : System.Text.InternalEncoderBestFitFallback DecoderFallback : System.Text.InternalDecoderBestFitFallback IsReadOnly : True CodePage : 932
コードページ変更。操作しているとPowerShellコンソールが異常終了する。
chcp 65001
コンソール表示のエンコーディングをUTF8に変更。数文字入力したらブルースクリーンで死亡。
[Console]::OutputEncoding = [Text.Encoding]::UTF8
いろいろ試してみての推測になるが、git logの出力はpager設定していなくてもデフォルトでlessを通しているようである。
lessを日本語対応のものに変更し、gitのログ出力エンコーディング設定をcp932に変更すると、UTF8のコミットログも文字化けせずに表示されるようになる。
git config --global i18n.logoutputencoding cp932
さらにいくつか組み合わせを変更して、最終的には以下の通り、gitのログ出力エンコーディングはutf-8にして、ページャ指定でnkf32に変換させるのが最も文字化けが少ない設定だった。
gitのログ出力エンコーディングはgitkやgit guiも使用するようなので、utf-8にしておいたほうがよい。
git config --global core.pager 'nkf32 | less'
git config --global i18n.logoutputencoding utf-8