読者です 読者をやめる 読者になる 読者になる

ねこ元帥の中の人@リウマチ

日々の覚書など。ブログ名はオンラインゲームのアカウント名をいつも「ねこ元帥」にしているから。そして、2013年11月リウマチと診断されたとです。(2012年11月から時々手足に原因不明の痛みが発生、2013年9月以降は足の痛みが常態化、2013年12月30日からMTX服用開始、4月過ぎるころにはわずかの痛みが残る程度まで回復して現在に至る。)

コミットログのエンコーティング指定

追記(2016/11/05)

プロセス間を流れる文字列のエンコーディングは以下のようになっている。

PS> git log {(1)UTF8で出力⇒(2)SHIFT_JISで入力} | {(3)ASCIIで出力} tee.exe git-log.txt

(1) gitが出力する文字列のエンコーディングi18n.logoutputencodingパラメータで指定可能。
(2) PowerShellがコンソールアプリケーションの出力を入力する際に使用するエンコーディング。[Console]::OutputEncodingで指定する。
(3) PowerShellの出力を他のアプリケーションに対して渡す際に使用するエンコーディング。$OutputEncodingで指定する。


以下のように使用すると、テキストファイルにutf-8の文字列が格納される。

PS> [Console]::OutputEncoding = [Text.Encoding]::UTF8
PS> $OutputEncoding = [Text.Encoding]::UTF8
PS> git log | tee.exe git-log.txt
PS> [Console]::OutputEncoding = [Text.Encoding]::Default
PS> $OutputEncoding = [Text.Encoding]::ASCII

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