PowerShellコンソール上でgit logの日本語が文字化けする件について調べてみた

gitリポジトリへのコミットログをUTF8とし、PowerShellコンソール上でコミットログを表示すると文字化けする。

PS C:\repo> git log
⇒文字化け

コマンドプロンプト上でコミットログを表示しても同じく文字化けする。

C:\repo> git log
⇒文字化け

UTF8をSJISに変換してやればよいはずなので、nkfを使用してみたところ、コマンドプロンプトでは正しく表示できたが、PowerShellコンソールでは文字化けしてしまった。
nkfで入力文字コードを調べたところ、以下のような結果だった。

PowerShell

PS C:\repo> git log | nkf32 -g
ASCII

コマンドプロンプト

C:\repo>git log | nkf32 -g
UTF-8

以下のコマンドを記入したbatファイルを作成してPowerShell上で実行したら、日本語が正しく表示された。

git log | nkf32

PowerShellのパイプラインあたりに何かがありそう。

端末作業環境設定

git-bashの設定

vi ~/.profile
. ~/.bashrc

vi ~/.bashrc
alias ls='ls --color=auto --show-control-chars'
alias la='ls -a'
alias ll='ls -l'
alias l='ls -CF'
alias vi='vim'

export LANG=ja_JP.utf-8

gitの設定

git config --global user.name "TAKAMATSU,Makoto"
git config --global user.email メールアドレス

git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto

git config --global core.autocrlf false
git config --global core.pager 'nkf32 | less'

git config --global gui.encoding = utf-8

git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8

PowerShellの設定
PowerShellコンソールからgit-bashを起動すると、カラー設定がコンソールの背景色と相性悪くて見づらい。以下の設定でPowerShellコンソールの背景色を黒に変更できる。

vi $PROFILE.CurrentProfile

$Host.UI.RawUI.BackgroundColor="Black"

上のコマンドでの設定変更では文字表示部分だけにしか反映されない。cls実行するとコンソール全体に色設定変更が反映されるけど、起動スクリプトにclsはなんとなく書きたくないし。表示クリアせずに色設定変更を反映させる方法はないものか。

ちなみに色設定に使用できる文字列は以下のコマンドで一覧表示できる。

[System.ConsoleColor].GetEnumValues()

今日買ってきた本

プログラマが知るべき97のこと

プログラマが知るべき97のこと

システム障害はなぜ二度起きたか みずほ、12年の教訓

システム障害はなぜ二度起きたか みずほ、12年の教訓

今日買ってきた本

7つの言語 7つの世界

7つの言語 7つの世界

アジャイルサムライ−達人開発者への道−

アジャイルサムライ−達人開発者への道−

ネットワークトラブル対応 徹底解説

ネットワークトラブル対応 徹底解説

独習 TCP/IP IPv6対応

独習 TCP/IP IPv6対応

パケットキャプチャ実践技術―Wiresharkによるパケット解析 応用編

パケットキャプチャ実践技術―Wiresharkによるパケット解析 応用編

PowerShellからsqliteを使用する

sqliteの.NET用ライブラリをダウンロードしてくる。

http://www.sqlite.org/download.html

PowerShellが使用する.NET Frameworkのバージョンを4に変更する。PowerShellを管理者モードで起動して、以下のコマンドを実行する。

@'
<?xml version ="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true" >
    <supportedRuntime version="v4.0.30319" /> 
  </startup>
  <runtime>
    <loadFromRemoteSources enabled="true"/>
  </runtime>
</configuration>

'@ | Out-File "${PSHOME}\powershell.exe.config" -Encoding ASCII

バージョン確認

$assemblies = [AppDomain]::CurrentDomain.GetAssemblies()
$assemblies | ?{$_.GetName().Name -like "System"}
GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll

sqliteライブラリの動作確認

[void][System.Reflection.Assembly]::LoadFile("C:\Tools\sqlite\System.Data.SQLite.dll")
$sqlite = New-Object System.Data.SQLite.SQLiteConnection
$sqlite.ConnectionString = "Data Source = C:\Tools\sqlite\data.db"
$sqlite.Open()

$cmd = @"
    CREATE TABLE hoge
    (
        id   INTEGER,
        name VARCHAR(20)
    )
"@

$sqlcmd = New-Object System.Data.SQLite.SQLiteCommand
$sqlcmd.Connection = $sqlite
$sqlcmd.CommandText = $cmd
$sqlcmd.ExecuteNonQuery()
$sqlite.Close()

今日買ってきた本

アート・オブ・コミュニティ ―「貢献したい気持ち」を繋げて成果を導くには (THEORY/IN/PRACTICE)

アート・オブ・コミュニティ ―「貢献したい気持ち」を繋げて成果を導くには (THEORY/IN/PRACTICE)

Software Design (ソフトウェア デザイン) 2011年 08月号 [雑誌]

Software Design (ソフトウェア デザイン) 2011年 08月号 [雑誌]