[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: subversionのメッセージが文字化けする



藤井です。

From: Shun-ichi GOTO <gotoh@xxxxxxxxxxx>
Subject: Re: subversionのメッセージが文字化けする
Date: Thu, 12 Jan 2006 20:51:26 +0900 (JST)
> > です。この fakecygpty.exe を通す/通さない で挙動が違うのはな
> > んでだろ? という話。
> > fakecygpty.exe を通さなければ svn の日本語がちゃんと表示でき
> > るのに、という話。
> 
> ちろっと試してみたところ f_bash による現象は再現しました。
> svn 2>&1 | cat  しても変わらず
> svn 2>&1 | od -x  や
> svn >svn.out 2>&1 してみると、出力されているデータ自体が
> ?\222 というのはそれぞれ文字である事がわかる。つまり svn がそう
> 出力している。
(snip)
> 雑感として、コマンドプロンプトから f_bash を起動した場合は良いのだから、
> 違いは Windows の実コンソールのあり方あたりがちょっとクサイかなぁと。
> というのも、f_bash から cmd を起動して、その中で svn (や他のコマンド)を
> 実行すると 一瞬コマンドプロンプトがちらりと表示されます。
> なんか Console まわりでの影響ではないかなぁ、なんて想像してみたりします。

どうやら後藤さんの想像通り Console まわりの影響だと思われます。
subversion/libsvn_subr/cmdline.c:svn_cmdline_init() を見る限り Win32 バ
イナリの svn.exe 出力すると、GetConsoleCP、GetConsoleOutputCP の両 API
から得られる情報を元に出力/入力の文字コードを決定している模様です。

そこで以下のような確認プログラムを作成してみました。
--------------------------------------------------
#include <windows.h>

int main()
{
  printf ("codepage(in)   = %d\n", GetConsoleCP());
  printf ("codepage(out)  = %d\n", GetConsoleOutputCP());
  printf ("codepage(ansi) = %d\n", GetACP());

  return 0;
}
--------------------------------------------------

Meadow の shell モードで実行した場合はこうなりますが、
$ ./codepage.exe
codepage(in)   = 932
codepage(out)  = 932
codepage(ansi) = 932

bash の代わりに f_bash を用いた fakecygpty 越しに実行した場合の shell
モードではこうなりました。
$ ./codepage.exe
codepage(in)   = 0
codepage(out)  = 0
codepage(ansi) = 932

ということで、コードページが正常に取得できていません。
# GetACP はコンソールとは無関係なのでこの場合でも正常に動作しています。

現象から判断すると、おそらく fakecygpty 越しに動作するプロセスはコンソー
ルを持っていないのだと思われますが、実際のところどうなのかは分かりませ
ん。

確認のために、win32 バイナリの iconv ディレクトリにある cp932.so をコピー
して cp0.so というファイルを用意してみると、fakecygpty 越しでも win32
バイナリで日本語表示ができます。これより fakecygpty 越しに起動した
win32 バイナリでは GetConsoleCP、GetConsoleOutputCP の両 API が 0 を返
している可能性が非常に高いことが推測されます。

--
藤井 正行 / Masayuki FUJII