が良くわからないので調べてみている
Windows 上では、SJIS と Unicode との対応がおかしく (他の環境と違う) て、一部記号などが想定と別の文字になったりする問題がある
ex. Windows 上では入力した文字が SJIS(CP932) から Unicode に変換される過程で
| つもり | 実は |
|---|---|
| WAVE DASH | FULLWIDTH TILDE |
と勝手におきかえられてしまう
これを修正するため、Emacs では lisp/language/japanese.el で japanese-ucs-jis-to-cp932-map japanese-ucs-cp932-to-jis-map (逆にしただけ) という対応表が用意されている (定義はあるが参照されておらず、ユーザが明示的に設定する必要がある?)
;; 該当部分 ;; → ((map ; JIS vs CP932 ;; ‘((#x301C . #xFF5E) ; WAVE DASH FULLWIDTH TILDE ;; (#x2014 . #x2015) ; EM DASH HORIZONTAL BAR ;; (#x2016 . #x2225) ; DOUBLE VERTICAL LINE PARALLEL TO ;; (#x2212 . #xFF0D) ; MINUS SIGN FULLWIDTH HYPHEN-MINUS ;; (#x00A2 . #xFFE0) ; CENT SIGN FULLWIDTH CENT SIGN ;; (#x00A3 . #xFFE1) ; POUND SIGN FULLWIDTH POUND SIGN ;; (#x00AC . #xFFE2) ; NOT SIGN FULLWIDTH NOT SIGN ;; (#x00A6 . #xFFE4) ; BROKEN LINE FULLWIDTH BROKEN LINE
※ただし、この表は JISX0208 のみに対応しており JISX0213 は考慮されていない →JISX0213 との対応を追加で調整する必要がある?
;; これらが足りない? ;; (#x007e . #x203e) ;Tilde Overline ;; (#x29bf . #x2299) ;Circled Dot Operator Circled Bullet ;; (#x2026 . #x22ef) ;Midline Horizontal Ellipsis Horizontal Ellipsis
(coding-system-put ‘cp932 :encode-translation-table (get .....)) →「コーディングシステム cp932 の :encode-translation-table プロパティを (get ....) に変更する」という動作
- 基本的にファイルは UTF-8-unix で扱っている (この場合は気にしなくて良い?)
- DDSKK で意図した文字を入力したい (通常、全角チルダを自ら入力することはない/どうしても必要なら C-x 8 RET で良い)
- 既存のファイルを開くときは、余計な変換などはせず、ただ文字化けしないように表示してくれれば良い
;; Unicode(内部コード)→CP932変換時に波ダッシュ(U+301C)を波ダッシュ(0x8160)に変換するよう設定する。
;; 波ダッシュと同様の変換問題のある文字も変わる。
;; encode 方向のみ設定する
;; - 内部で保持している時には読み込んだままの unicode で保持
;; - ISO-2022/SJIS系の文字コードで画面出力や、ファイルにセーブする時に対応する文字コードに変換
;; ファイルの内容に影響を与えず、そのまま UTF-8 や CP932 のファイルの読み書きするため
(coding-system-put 'cp932 :encode-translation-table
(get 'japanese-ucs-jis-to-cp932-map 'translation-table))
;; これも必要?
(dolist (coding-system '(sjis shift_jis-2004
euc-jp euc-jis-2004 euc-jisx0213
iso-2022-jp iso-2022-jp-2 iso-2022-jp-2004 iso-2022-7bit
))
(coding-system-put coding-system :encode-translation-table
(get ‘japanese-ucs-cp932-to-jis-map ‘translation-table))
;; (coding-system-put coding-system :decode-translation-table
;; (get ‘japanese-ucs-jis-to-cp932-map ‘translation-table))
)
;; 全角チルダ/波ダッシュ (のみ) をWindowsスタイルにする
(let ((table (make-translation-table-from-alist '((#x301c . #xff5e))) ))
(mapc
(lambda (coding-system)
(coding-system-put coding-system :decode-translation-table table)
(coding-system-put coding-system :encode-translation-table table)
)
'(utf-8 cp932 utf-16le)))