Skip to content

Instantly share code, notes, and snippets.

@lurdan
Created October 6, 2017 05:59
Show Gist options
  • Select an option

  • Save lurdan/818ec2b943d51d82c59ce9f081c82b80 to your computer and use it in GitHub Desktop.

Select an option

Save lurdan/818ec2b943d51d82c59ce9f081c82b80 to your computer and use it in GitHub Desktop.

cp932 向けの変換設定

が良くわからないので調べてみている

脳内ダンプ

Windows 上では、SJIS と Unicode との対応がおかしく (他の環境と違う) て、一部記号などが想定と別の文字になったりする問題がある

ex. Windows 上では入力した文字が SJIS(CP932) から Unicode に変換される過程で

つもり実は
WAVE DASHFULLWIDTH 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 で良い)
  • 既存のファイルを開くときは、余計な変換などはせず、ただ文字化けしないように表示してくれれば良い

変換テーブルを CP932 に適用すれば OK?

;; 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))

変換テーブルを日本語を扱いそうな coding system 全てにつっこめば OK?

;; これも必要?
(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)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment