[Date Prev][Date Next][Thread Prev][Thread Next][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 )