UTF8で半角カナが豆腐になる件

困っていたこと

ファイルのエンコーディングUTF-8の時,
半角カタカナを入力すると,豆腐になってしまう。
Mule-UCSというのがあるみたいだが,
なんか使いたくない。

環境

This is Meadow-3.00-dev (KIKU)
 based on GNU Emacs 22.1.1 (i386-mingw-nt5.1.2600)
 of 2007-07-08 on CUBE
URL: http://svn.meadowy.org/Meadow/trunk
Last Changed Rev: 4213
Last Changed Date: 2007-07-07 09:39:18 +0900 (Sat, 07 Jul 2007)

解決策

以下を.emacsに追加。
だが,これによりどんな副作用があるかはわかりまへん。

;; UTF-8 において,半角カナをmule-unicode-e000-ffffに変換させないため
(setq-default translation-table-for-input nil)

なぜにこれで解決するのか?

http://www.bookshelf.jp/2ch/unix/1156781437.html
の20から30くらいに同じ問題で困っていた人がいたみたいです。

3330sage2006/09/04(月) 12:49:19
    translation-table-for-input に katakana-jis0201 から mule-unicode への
    変換が定義されているためのようです。
    ためしに translation-table-for-input を nil にしたところ、katakana-jis0201
    が挿入されました。 


要するに,Windows 上のIMEから,Meadowに入力渡すときには,
まだ半角カタカナ。
Meadowが画面に表示する前に,ごにょごにょするってことか?



あと,こんなんとか。
(http://www.m17n.org/mlarchive/mule-ja/200309/msg00002.htmlから引用させてもらいまふ)

utf-translate-cjk-mode は mule-unicode-XXXX-YYYY のどの文字
セットにも格納できない Unicode文字を JIS/GB/BIG5/KSC 等に
translate するものなんですが、それらの記号は Unicode では 
U+FF0? にあり、mule-unicode-e000-ffff に格納できるため、 
JISX に translate されないのです。

例えば、以下を実行すればちゃんと表示はできるようになるはずで
す。

(require 'disp-table)

(dolist (elt '((#xff01 . ?!)
	       (#xff03 . ?#)
	       (#xff04 . ?$)
	       ;; ...
	       (#xff5e . ?〜)))
  (aset standard-display-table (decode-char 'ucs (car elt))
	(vector (cdr elt))))

でも、 mule-unicode-e000-ffff の文字の文字幅はすべて1なので
fill 等でちょっと不具合が発生します。

後半のコードを評価しても変化がわからんかったですが,
豆腐をM-x describe-char すると,たしかにmule-unicode-e000-ffffに,
マップされてました。


戯れ言

いやー,時間かかりましたで。ほんと遠回りしたっす。
utf-translate-cjk-set-unicode-range をいじってみたり,
utf-8.elの中身を見てみたり。
結局答えはWebにありましたお。orz
過去ログを保存しているBookshelf.jpさんに感謝,感謝。


M-x describe-fontset すると,jisx0201にフォントセットが
割り当てられてないので,あれー? あれー?って思ってました。


sjisでは半角カナが入力できて,豆腐にならないこと。
ほいで,そのファイルをMeadow上で,UTF8に変換すると,
オッケー。さらには,再度そのファイルを開いても,
豆腐になっていないこと。
これらにもっとはやく気がついていれば,(ry


まとめ

  • 文字コードはむずい。
  • M-x describe-char を覚えた!! (これは便利そうだし,おもしろいねぇ。)
  • M-x describe-fontset を覚えた!! (これも便利そうだぽ)
  • こないだの全角記号が豆腐になる件と合わせて,一応,問題は解決された・・・はず。
  • あとで容易に利用できるように,こないだの分も合わせて,残しておきます。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; U+0080 - U+2E7F の文字を CJK にデコード
;; http://nijino.homelinux.net/emacs/utf-cjk.html
;; JIS拡張漢字(JIS X 0213)
;; http://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0213/jisx0213-1.html
(utf-translate-cjk-set-unicode-range
 '((#x00a2 . #x00a3)                    ; ¢, £
   (#x00a7 . #x00a8)                    ; §, ¨
   (#x00ac . #x00ac)                    ; ¬
   (#x00b0 . #x00b1)                    ; °, ±
   (#x00b4 . #x00b4)                    ; ´
   (#x00b6 . #x00b6)                    ; ¶
   (#x00d7 . #x00d7)                    ; ×
   (#X00f7 . #x00f7)                    ; ÷
   (#x0370 . #x03ff)                    ; Greek and Coptic
   (#x0400 . #x04FF)                    ; Cyrillic
   (#x2000 . #x206F)                    ; General Punctuation
   (#x2100 . #x214F)                    ; Letterlike Symbols
   (#x2190 . #x21FF)                    ; Arrows
   (#x2200 . #x22FF)                    ; Mathematical Operators
   (#x2300 . #x23FF)                    ; Miscellaneous Technical
   (#x2500 . #x257F)                    ; Box Drawing
   (#x25A0 . #x25FF)                    ; Geometric Shapes
   (#x2600 . #x26FF)                    ; Miscellaneous Symbols
   (#x2e80 . #xd7a3)                    ; East Asian Scripts
   (#xff00 . #xffef)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; UTF-8 において,半角カナをmule-unicode-e000-ffffに変換させないため
(setq-default translation-table-for-input nil)
  • 最後に。私,半角カタカナはまず使わない。