@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Selected encoding XXXX disagrees with XXXX specified by file contents. というエラー

Selected encoding mule-utf-8-unix disagrees with euc-jp-unix specified by file contents.  Really save (else edit coding cookies and try again)? (yes or no)\

charset=UTF-8 とか meta に書いてある HTML ファイルを開いて euc-jp に書き直して euc-jp で保存し直したいときに100%このメッセージが出て、 yes を選ぶと u マークで(UTF-8 で)保存しやがるくせにファイルを開くと盛大に文字化けている(meta に euc-jp とあるので emacs が気を利かせて euc-jp だとみなして開くが実際には utf-8 で符号化されているので化ける、のだと思う)。 no を選ぶと保存できない。という、 emacs だけではどうしようもない事態に陥ってしまっててがでない。なんでだ。 C-x RET C-v とか C-x RET C-c などはいろいろ試してみた上での話。

(set-language-environment 'Japanese) したらわかった(解決はしなかったが手がかりを得られた)。

▲という文字が、 euc-jp-unix では符号化できない文字で、だからその文字を含むバッファ(と関連づけられているファイル)は euc-jp-unix を選んで保存はできないよ、ということだった。この文字を消せば保存できる。そして改めて開き同じ▲という文字を書き込んで保存すると、そこだけ化ける。

UTF-8 なバッファで▲の上で C-u C-x = して得られた情報

character: e$,2!re(B (299250, #o1110362, #x490f2, U+25B2)
charset: mule-unicode-2500-33ff (Unicode characters of the range U+2500..U+33FF.)
code point: #x21 #x72
syntax: w which means: word
buffer code: #x9C #xF2 #xA1 #xF2
file code: #xE2 #x96 #xB2 (encoded by coding system mule-utf-8-unix)
display: terminal code #xE2 #x96 #xB2

There are text properties here:
fontified t

[back]

EUC-JP なバッファで▲の上で C-u C-x = して得られた情報

character: < (60, #o74, #x3c, U+003C)
charset: ascii (ASCII (ISO646 IRV))
code point: #x3C
syntax: (> which means: open, matches >
category: a:ASCII graphic characters 32-126 (ISO646 IRV:1983[4/0]) l:Latin
Properties: jisx0208: 53475;
buffer code: #x3C
file code: #x3C (encoded by coding system japanese-iso-8bit-unix)
display: terminal code #x3C

There is an overlay here:
From 3608 to 3609
face show-paren-match
priority 1000


There are text properties here:
fontified t

[back]

下の、 ascii になってるほうを無理矢理保存すると化ける。つまり Emacs はとてもお行儀が良いのでこんなところまで面倒を見てくれるのか。余計なお世話だ。

教訓として、 (set-language-environment 'Japanese) はつけておいたほうがいい。

↑あまり良くなかった。 eshell バッファが化ける。 terminal-coding-system は utf-8 なんだけどな。どこかしらで euc-jp になってしまうらしい。悩ましい。しかし、 html ファイルを保存するとき、 charset=XXXX の値によって勝手に文字コードを変えて保存する挙動は結構気持ちが悪い・・・。