[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
sjis pages broken?
- From: Katsumi Yamaoka <yamaoka@xxxxxxx>
- Date: Mon, 19 Apr 2004 19:22:35 +0900
- X-ml-name: emacs-w3m
- X-mail-count: 06662
charset の指定が無い sjis の web ページ[1] が文字化けするので調
べたところ、ぼくの Emacs が LANG=C の環境で稼働しているせいでし
た。
[1] 例えば http://www3.ocn.ne.jp/~egroup/mono/ex3f/ex3.html
以下は w3m-rendering-half-dump() から抜き出した実験式です。
(with-temp-buffer
(insert "ホゲ")
(let* ((process-environment (copy-sequence process-environment))
(coding-system-for-read 'utf-8)
(coding-system-for-write 'shift_jis)
(default-process-coding-system
(cons coding-system-for-read coding-system-for-write)))
(setenv "LANG" "C")
(call-process-region
(point-min) (point-max) "w3m" t t nil
"-halfdump" "-o" "ext_halfdump=1" "-o" "strict_iso2022=0"
"-o" "ucs_conv=1" "-O" "UTF-8" "-T" "text/html" "-t" "8"
"-cols" "79" "-o" "display_image=off")
(buffer-string)))
=> "?z?Q\n<internal>\n</internal>\n"
C に限らず日本語系ではない LANG の環境でもこれは起きるわけで、例
えば日本語が読める欧米の人も、ぼくと同じ経験をするはずです。上記
の場合、入力 charset の判定は w3m に委ねられるのですが、正しい結
果を期待するのは無理というものでしょう。
C c shift_jis RET をタイプすれば、それが w3m に渡されて文字化け
は起きなくなりますが、毎回そうしなければならないのも面倒です。
そういう charset の指定が無い sjis の web ページでも Emacs は正
しく shift_jis だと判定して、値を w3m-current-coding-system に納
めてくれるので、sjis だけ特別扱いして w3m に渡す引数に追加すれば
良いのではないかと考えました。具体的には、変数
w3m-halfdump-command-arguments に含まれている
'(if charset (list "-I" 'charset))
を
'(if charset
(list "-I" 'charset)
(if (eq (coding-system-base coding-system-for-write)
'japanese-shift-jis)
(list "-I" "SHIFT_JIS")))
で置き換えます (w3m-rendering-half-dump() において
coding-system-for-write は w3m-current-coding-system の値に束縛
されています)。
しかしこれも current-language-environment が Japanese でなければ
(つまり sjis が coding-priority の上位になければ)、そもそも
Emacs は sjis だと判定してくれないでしょう。
結局、いつでも sjis を正しく扱うのは無理ということでしょうか。
--
Katsumi Yamaoka <yamaoka@jpl.org>