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

sjis pages broken?



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>