Posts tagged ‘UTF-8’

majordomo におけるフッタ追加機能

運用の管理を担当しているメーリングリストで、このところ文字化けの問い合わせが増えてきた。調べてみたところ majordomo がメール本文に追加するフッタ文字列が原因らしい。majordomo は本文のエンコード状況に関わらず、そのままプレーンテキストのフッタを追加しているようだ。そのため本文がプレーンテキストでない場合、本文中には複数のエンコーディングが混在してしまうが、マルチパート用にメールヘッダを書き直すことはしない。そして結果的に受け取り側メールクライアントによっては、正しく表示できない状況が発生する。

ここのメーリングリストには、ほとんどプレーンテキストしか流れていなかったので、これまでは問題にならなかった。しかし、プレーンテキストにも関わらずエンコードされたメールが、最近発信されるようになったため不具合が顕在化してきた。ちなみに問題のメールのヘッダはこんな感じになっている。

Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: base64

このようなデータであっても、大抵のメールクライアントはエンコード部分をデコードしてくれて、なんの問題も無く読めてしまう。もっとも majordomo が追加したフッタの表示はおかしくなっていたり、まったく表示されなかったりするのだが、本文が読めているため気付きにくくなっている。ところが Gmail でこのメールを表示させると、肝心の本文部分のデコードは行われずにエンコードされたままのテキストが表示される。不具合の問い合わせをしてきた利用者も Gmail を使っていた。

結局、これまでフッタに追加していた情報は、それほど重要なものではなかったので、majordomo におけるフッタ追加の機能を無効にすることで、この不具合を回避することにした。

ところで、そもそもこの不具合に気付いたのは、単純なプレーンテキストがわざわざエンコードされてきたからだった。実はこれにも Gmail が絡んでいた。Gmail に限らずいわゆる Web メールの GUI でメール本文を入力するとき、利用者が改行を入力するまでいくらでも長い文字列を1行として入力できてしまう。このような本文を書いて送信すると、Gmail はどうも自動的に base64 でエンコードするようだ。この仕様はたぶん間違っていないと思う。ちなみに文字コードに utf-8 を指定している場合は、行の長さに関係なく無条件にエンコードされるようだ。

これからはどう考えてもエンコードされたマルチパートで構成されるメールが増えてくるだろうから、majordomo では対応しきれなくなってくるだろう。今回のようにメーリングリストの中継点でメール本文にヘッダやフッタを追加するには、送られてきたメール本文のエンコード状況を解析し、マルチパート化するような処理をしなければいけないのだと思う。最近はあまりメーリングリストに関する技術情報が出回っていないような気がするが、Mailman だったらこんな要求に対しても対応できるのだろうか。この際だからいっそのこと Google Groups のような既存の無料メーリングリスト・サービスなどに身を委ねてしまえば楽になれるのかもしれない。

Emacs における矢印や記号文字の取扱い — その後

Emacs 23.1.1 が出たのでインストールしてみた。さっそく起動してみたら .emacs の設定ワーニングが出る。以前に書いた「Emacs における矢印や記号文字の取扱い」で追加した utf-translate-cjk-set-unicode-range の記述が原因のようなので、とりあえずこれを外してみた。そうしたところ設定ワーニングは出なくなったうえに、そのままの状態でも矢印や記号文字も問題なく表示されるようになっていた。Emacs のバージョンが上がって utf 対応が進んだようだ。

ちなみに矢印や記号文字の問題が解消されたのは、GNOME 上の GUI 版 Emacs と Windows + PuTTY 環境の場合である。GNOME 端末上で Emacs を -nw オプションで起動した場合は、あいかわらず矢印や記号文字が正しく表示されない。もっともこちらは Emacs の問題ではなく、GNOME 端末におけるフォント選択か、またはその設定が原因になっていると思われる。

Emacs における矢印や記号文字の取扱い

Emacs 22.3.1 を使って日本語の “→”(漢字の矢印文字)や “※”(こめ印)などを含む文書やプログラムコードを編集しようとすると、表示やカーソル移動の挙動がおかしくなる。これらの文字はいわゆる機種依存文字ではないはずだし、Meadow や日本語対応を明示している版だと問題なかったはずなので、素の Emacs 特有の問題だろうと推測したものの、対策することなくそのままにしていた。しかし、最近またコメント中に “→” を書いてあるコードを触ることになり、この不具合に出くわしたので調べてみたところ、次のところで回答を見つけることができた。

http://www.pqrs.org/tekezo/emacs/doc/wide-character/index.html

このサイトの情報によれば「UTF-8 において文字幅が文脈依存(ambiguous)となる文字」に対して、emacs はデフォルトで narrow character として判定するのに、表示される文字は wide character なので不具合が起こるようだ。確かにこの説明を読むとカーソル移動の挙動が納得できる。同様の現象は emacs だけでなく vi などでも発生するということだったので、vi で確認したところ確かに同じ状況となっていた。

前述のサイトに該当文字群を wide character として認識させるための emacs 用スクリプトが掲載されていたので、これを .emacs に追加することで一応は不具合を解消することができた。しかし、この設定だといわゆるローマ数字など、不具合の出る文字がまだあることに気付いた。また、機種依存文字と思っていた丸囲み数字なども unicode では定義されているので、これらの文字のコード範囲と思われるものをスクリプトに追加してみたが、なぜかうまくいくところとそうでないところがあった。結局ローマ数字の範囲だけを追加するにとどまった。通常の作業にはこれでおおよそ対応できるはずだ。

(utf-translate-cjk-set-unicode-range
  ‘((#x00a2 . #x00a3) ; ¢, £
    (#x00a7 . #x00a8) ; §, ¨
    (#x00ac . #x00ac) ; ¬
    (#x00b0 . #x00b1) ; °, ±
    (#x00b4 . #x00b4) ; ´
    (#x00b6 . #x00b6) ; ¶
    (#x00d7 . #x00d7) ; ×
    (#X00f7 . #x00f7) ; ÷
    (#x0370 . #x03ff) ; Greek and Coptic
    (#x0400 . #x04FF) ; Cyrillic
    (#x2000 . #x206F) ; General Punctuation
    (#x2100 . #x214F) ; Letterlike Symbols
    (#x2190 . #x21FF) ; Arrows
    (#x2200 . #x22FF) ; Mathematical Operators
    (#x2300 . #x23FF) ; Miscellaneous Technical
    (#x2500 . #x257F) ; Box Drawing
    (#x25A0 . #x25FF) ; Geometric Shapes
    (#x2600 . #x26FF) ; Miscellaneous Symbols
    (#x2e80 . #xd7a3)
    (#xff00 . #xffef)

    (#x2160 . #217f)))

補足(2009-07-31 追記):
Emacs のバージョン 23.1.1 からは前記の設定をしなくても、問題は発生しなくなっている。逆にこの設定のままだと 23.1.1 では起動時にワーニングが出るので、utr-translate-cjk-set-unicolde-range の設定は解除したほうが良い。→「Emacs における矢印や記号文字の取扱い ? その後」