[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: sjis pages broken?



>> On Mon, 19 Apr 2004 20:36:59 +0900
>> pooh@nature.tsukuba.ac.jp (Hiroshi Fujishima) said as follows:

山> <META> タグで charset=shift-jis が指定され、環境変数 LANG が日本語
山> 系の値になっていても文字化けする sjis のページを見つけてしまいまし
山> た。

山> http://ec.ikuei-sp.ac.jp/space/smile/kirchhoff/

これは,C c (= w3m-redisplay-with-charset) が正しく動作するようにする
ため,w3m-remove-meta-charset-tags() が META タグを取り除いているから
だろうと思います.

藤> http://physics.px.tsukuba.ac.jp/syllabus/ も文字化けします。

ただ,どちらのページも w3m-view-source() では文字化けもせずに表示でき
ましたから,Emacs の文字コード判定は正しく動いていて,それと w3m との
連携がうまく動いていないということになりそうですね.

現在,文字コードの処理は [emacs-w3m:05294] で説明した通りに以下のよう
な流れになっています.

  w3m-retrieve()
    => unibyte のデータを取得.

  w3m-prepare-text-content()
    => w3m-decode-buffer() を呼び出して,バッファの内容を decode する.

  w3m-rendering-buffer()
    => 常に,multibyte 表現の buffer を対象として動作.w3m-filter() は
       この段階で呼び出される.

  w3m-rendering-half-dump()
    => w3m の場合は,w3m-input-coding-system(= w3m-euc-japan) で 
       encode したバイト列を w3m に渡す.
    => w3mmee / w3m-m17n の場合は,w3m-current-coding-system で encode 
       したバイト列を渡す.w3m-current-coding-system は,
       w3m-decode-buffer() でバッファを decode する時に用いられた文字
       コードだから,同一の文字コードを用いた decode / encode が可逆操
       作ならば,実際に emacs-w3m が受け取ったバイト列が再現されるはず.

w3m-0.5 を使っていて (eq w3m-type 'w3m-m17n) が成り立っている場合,サー
バーが適切な charset をへッダに送信していれば,その charset が -I オプ
ションを使って w3m に渡されます.しかし,適切な charset 情報がなかった
場合には,-I オプションは渡されず,w3m は文字コードを自動判定しなけれ
ばならなくなります[*].山岡さんの例も,藤島さんの例も,ここで自動判定
に失敗しているのだろうと思います.

[*] しかも,前述の理由により,META タグは既に取り除かれてしまっていま
    すから,文字コードの自動判定には不利な状況です.

したがって,解決策としては「文字コードの判定は全て Emacs 上で行うよう
にする」という方法が考えられます.具体案としては2通りあるでしょう.

(1) w3m-current-coding-system から charset を得る関数を書き,常に -I 
    オプションが指定されるようにする.

      利点: 文字コードの余分な変換を伴わない.
      欠点: coding-system から charset を求める portable な方法を実装
            するのが面倒.

(2) w3m-m17n / w3mmee についても,何か適当な文字コードでデータを渡すよ
    うにする.例えば,以下のように.

        (setq w3m-input-coding-system 'iso-2022-7bit-ss2
              w3m-halfdump-command-arguments
              (list "-halfdump"
                    "-o" "ext_halfdump=1"
                    "-o" "strict_iso2022=0"
                    "-o" "ucs_conv=1"
                    "-I" "ISO-2022-JP-2"
                    "-O" '(if (eq w3m-output-coding-system 'utf-8)
		              "UTF-8"
		            "ISO-2022-JP-2")))

      利点: 実装が簡単.
      欠点: iso-2022-7bit-ss2 で表現できない文字は再現できない.

さて,どうしたものでしょうか.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )