彷徨えるフジワラ

年がら年中さまよってます

滑り込みで文字化けの修正

Mercurial の主要なコマンド/エクステンション/ヘルプトピックのメッセージを概ね翻訳し終えた。

今回のリリースでは、新機能としてリビジョン指定言語("hg help revsets")が追加された他に、用語集("hg help glossary")も追加されているため、段落分割で共有されたものが幾つかあるにしても、翻訳対象が随分増えた。

98% 程だった以前の翻訳率と比べると、84% と随分落ちてしまったけど、07/01 リリースまで時間も無いので、とりあえず動作確認&コミットしてしまうことに。
まずは "hg help" でサマリ行の翻訳状況を確認。

有効化されているエクステンション:

 children   子\203"ェンジセット表示のコマンド
 graphlog   端末でのリビジョングラフ表示のコマンド
 mq         パッ\203"併用の管理
 patchbomb  電子メールによる変更内容パッ\203"送付のコマンド
 win32text  改行\214"式の自動変換

.... あれ?文字化けしてる。

おかしいなぁ、折り返し処理の文字化けは対処済みの筈なのだが。各コマンドの "hg help" 出力等を確認する限りでも、折り返し部分の問題では無さそうな感じ。

新規の障害?がびーん!公式スケジュール上だと、あと1日ぐらいしか余裕が無いのに! > 1.6 版リリース

とりあえず、呆然としていても問題は解決しないので、地道に条件を絞り込むことに。

ざっと現象を見た限りでは、折り返し問題のような「場所」ではなく、特定の「文字」に限って化けているような印象なので、化けている文字を拾い集めてみた。

「チ」「冒」「形」あたりが化けているみたいなので、これらの文字のバイト列を CP932(Shift_JIS ね) で確認してみると:

  • チ: 83 60
  • 冒: 96 60
  • 形: 8c 60

.... 0x60(`: バッククォート)か!あれ?そういえば文字化けの箇所って:

 children   子\203"ェンジセット表示のコマンド
 graphlog   端末でのリビジョングラフ表示のコマンド
 mq         パッ\203"併用の管理
 patchbomb  電子メールによる変更内容パッ\203"送付のコマンド
 win32text  改行\214"式の自動変換

軒並み2バイト目がダブルクォート(")になってたなぁ ..... あ!わかった!

メッセージ翻訳の際に、「:hg:`command -opt arg`」と記述した部分を「"hg command -opt arg"」と変換する機能が追加されているのに気付いたんだけど、ひょっとしてバイト列中のバッククォートを問答無用でダブルクォートに変換してるのでは? > mercurial/minirst.py

.... 予想通りだった。あー、それは化けるわ@CP932。

ということで、変換処理の中間形式として一旦 unicode 文字列に変換する修正版で早速試してみると、無事文字化けは解消。リリース間際だったので、送付したパッチの取り込み採否を心配してたのだけど、どうやら速やかに取り込まれた模様。

UTF-8EUC な環境で確認していたら、危うく気が付かないところだったので、無事水際で食い止めたと言えるけど、そもそもこんなに問題を抱えている符号化方式ってどうよ?

省資源重視な 20 世紀的には、EUC 等と比較した際の「半角カタカナを想定した場合の情報密度の高さ」がメリットだったかもしれないけど、ASCII 文字混在時の処理を考えると、資源豊富な 21 世紀的には欠陥符号化方式な気が > CP932/Shift_JIS

# 「バイト数」=「表示幅カラム数」なところもか? > メリット

でも、最大ユーザベースを抱えるであろう MS-Windows では、ロケール固有符号化を CP932 から変更すると軒並み表示の乱れるプログラムだらけな状況(@自前の Vista 環境)なので、当面は何とか折り合いを付けて行くしかないんだろうなぁ。

ちなみに、Mercurial 1.6 版は予定通り 07/01 にリリースされました