[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
Re: subversionのメッセージが文字化けする
- X-ml-count: 6890
- Subject: Re: subversionのメッセージが文字化けする
- From: "M.Fujii" <boochang@xxxxxxxxxxxx>
- Date: Fri, 13 Jan 2006 07:53:11 +0900 (JST)
- X-mailer: Mew version 4.2 on Emacs 22.0.50 / Mule 5.0 (SAKAKI)
藤井です。
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