まさか、こんなところで文字コード問題に悩まされるとは思わなかったよ
とりあえず、わかったことだけ書いておこう。
現象
Windows から TeraTerm で Fedora 9 にログインし、Emacs のコンパイルモードで SL Viewer 1.21.x をビルドし、エラーが出たところで M-x ` でソースの該当箇所を表示させると、Emacs の画面表示が乱れ、編集を継続できない。C-l でも改善しない。
驚いたことに、同じ状況で、1.20.x のビルドの場合は問題が起きない。
Fedora 9 に直接 (コンソールから) ログインし、Emacs のコンパイルモードを使うと問題は起きない。1.20.x のビルドはもちろん、1.21.x のビルドでも。(Emacs で --display :0.0 としてウィンドウを開いた場合でも、-nw として gnome-terminal 内で動かした場合でも。)
解決への道のり
いろいろ試しているうちに、C-l を押して再描画したあとで、画面が何行かスクロールアップしていることに気づきました。C-l では上から順に書き直して終わりのはずなので、これは変です。そこで最初は画面の寸法が混乱しているのではないかと考えて調べましたが、はずれでした。
また、コンパイルする SL Viewer が 1.20 では問題が起きないため、さすがにソースそのものは関係ないだろうということで、ビルド環境も疑いました。1.20はsconsでビルドするのですが、1.21からはcmakeに変ったので。結論から言うと、これは正解に近づいていましたが、はずれでした。
実は、1週間くらい原因がわからなくて困っていたのですよ。それが、先ほど、突然、気づいたのです。1.21で急に発生するようになった原因は gcc のバージョンでした。gcc を 4.3 にしたせいだったのです。
1.19 までの SL Viewer は、gcc 3.4 を使ってビルドするのが標準で、gcc 4 対応も行われていましたが、4.3 とは相性が悪く gcc 4.1 を使う必要がありました。それが、1.21 から、4.3 でもビルドできるように微調整が行われています。Debian とかは、gcc は今でも 4.1 が標準らしいのですが、Fedora は 4.3 になっています。このため、Viewer ソースを 1.21 にしたところで、gcc の 4.3 を使うようになっていたのです。
では、gcc 4.3 を使うと、どうして Emacs の画面表示が乱れるのか。原因は、これでした。
llfontgl.h:239: error: ‘HAlign’ has not been declared
gcc 4.3 では、こんな感じにエラーが出るのですが、よーく見ると、HAlign の前後の引用符が全角になっています…。そう、これは、東アジアのエンジニアの感覚では全角ですが、欧米のエンジニアにとってはUnicode Smart Quoteと呼ばれる<b>普通の文字</b> (横幅が広いアジアの変な文字ではなくて、普通の横幅を持った自分たちの文字) の一種なんですね。彼らにとっては普通の文字だから、コンパイラの英文のエラーメッセージ中で普通に使う。で、Emacsも、これは普通の文字だと思っているから「半角」のつもりで画面の座標を計算する。gnome-terminal も、普通の文字として表示する。でも、TeraTermは日本で作られたソフトなので、この文字は全角文字だと思っていて、全角として表示する。その結果、Emacsが意識する画面のカラムと、TeraTermが表示する画面のカラムがずれてしまい、画面表示が乱れるのです。
いやー、まさか、こんなことになっていたとは。
で、解決策ですが、
さすがの gcc も問答無用でsmart quoteを使うわけではなく、ロカールが *.UTF-8 のときだけだろうと予想し、コンパイルするときに
LANG=C make
としてみたところ、エラーメッセージが、
llfontgl.h:239: error: 'HAlign' has not been declared
とASCII文字だけになり、解決しました。
« やっぱりLLFontって、壊れてるなぁ。 | トップページ | 逆立蟲 »
コメント