個人的に EUC-JP で書かれたファイルと、EUC-JIS-2004 で書かれたファイルの両方ともに、それなりの数を保有しているため、その区別が問題になっています。酷いものになる一つのファイルの中に EUC-JP と EUC-JIS-2004 の文字が混在してしまっています。(そももかな漢字変換用の辞書の .skk-jisyo からして混在になちゃってたりして。) JIS X 0213 が補助漢字(JIS X 0212)を包含してくてれいれば良かったんですけどね。
補助漢字にしか存在しない文字もあるため、規格的に言えば正しくないのでしょうが、EUC-JP と EUC-JIS-2004 を同時に扱う互換エンコーディングを定義することにしました。
;; ;; Japanese EUC-JP Compatible Table ;; ;; treat undefined JIS X 0208 character as JIS X 0213-1 character. ;; treat undefined JIS X 0213-2 character as JIS X 0212 character. ;; treat JIS C 6226 character as corresponding JIS X 0208/0213/0212 character. ;; (let ((c1 #x21) (table (make-translation-table)) (table2 (make-translation-table))) (while (<= c1 #x7e) (let ((c2 #x21)) (while (<= c2 #x7e) (let* ((uchar (lambda (c) (and c (<= c #x10ffff)))) (comb (get 'jisx0213-to-unicode 'translation-table)) (cc (logior (lsh c1 8) c2)) (j0208-78 (decode-char 'japanese-jisx0208-1978 cc)) (j0208 (decode-char 'japanese-jisx0208 cc)) (j0212 (decode-char 'japanese-jisx0212 cc)) (j0213-1 (decode-char 'japanese-jisx0213.2004-1 cc)) (j0213-2 (decode-char 'japanese-jisx0213-2 cc)) (rev_j0208-78 (and (funcall uchar j0208-78) (or (encode-char j0208-78 'japanese-jisx0208) (encode-char j0208-78 'japanese-jisx0213-1) (encode-char j0208-78 'japanese-jisx0213.2004-1) (encode-char j0208-78 'japanese-jisx0213-2) (encode-char j0208-78 'japanese-jisx0212)))) (rev_j0212 (and (funcall uchar j0212) (or (encode-char j0212 'japanese-jisx0213-1) (encode-char j0212 'japanese-jisx0213.2004-1) (encode-char j0212 'japanese-jisx0213-2))))) (when (and (not (funcall uchar j0208)) (or (funcall uchar j0213-1) (aref comb j0213-1))) (aset table j0208 j0213-1) (aset table2 j0213-1 j0208)) (when (not rev_j0208-78) (aset table2 j0208-78 j0208)) (when (and (not (funcall uchar j0213-2)) (funcall uchar j0212)) (aset table j0213-2 j0212) (when (not rev_j0212) (aset table2 j0212 j0213-2)))) (setq c2 (1+ c2)))) (setq c1 (1+ c1))) (set-char-table-parent table2 (get 'ja-compatible-encode-map 'translation-table)) (define-translation-table 'ja-compatible-decode-eucjp-map table) (define-translation-table 'ja-compatible-encode-eucjp-map table2)) ;; ;; coding system ;; euc-ja-compatible ;; (define-coding-system 'euc-jp-compatible "ISO 2022 based EUC encoding for japanses for JIS X 0213 (and JIS X 0212)." :coding-type 'iso-2022 :mnemonic ?E :designation [ascii japanese-jisx0208 katakana-jisx0201 japanese-jisx0213-2] :flags '(short ascii-at-eol ascii-at-cntl single-shift) :charset-list '(ascii japanese-jisx0208 japanese-jisx0213-1 japanese-jisx0213.2004-1 japanese-jisx0213-2 japanese-jisx0212 latin-jisx0201 katakana-jisx0201 japanese-jisx0208-1978) :mime-charset 'euc-jis-2004 :decode-translation-table (get 'ja-compatible-decode-eucjp-map 'translation-table) :encode-translation-table (get 'ja-compatible-encode-eucjp-map 'translation-table) ) ;(define-coding-system-alias 'japanese-iso-8bit 'euc-jp-compatible) ;(define-coding-system-alias 'euc-jis-2004 'euc-jp-compatible) ;(define-coding-system-alias 'euc-jisx0213 'euc-jp-compatible) ;(define-coding-system-alias 'euc-japan-1990 'euc-jp-compatible) ;(define-coding-system-alias 'euc-japan 'euc-jp-compatible) ;(define-coding-system-alias 'euc-jp 'euc-jp-compatible)
この euc-jp-compatible という coding-system を使うことにより、EUC-JP と EUC-JIS-2004 の混在環境が利用ができるようになります。補助漢字と第三、第四水準の両方の文字が使える unicode 環境などで EUC-JP系と文字コードを扱う場合などに便利ではないかと思います。
この coding-system では、あえてファイルの文字集合の保存は行っていません。補助漢字(JIS X 0212)と、第三/第四水準(JIS X0213)の両方い重複している文字がある場合には 積極的に JIS X 0213 の文字コードの方で出力します。補助漢字にしか含まれていない文字のみ補助漢字で出力します。このため EUC-JP のファイルを読み込んでセーブしただけで内容が変更されてしまう場合があります。(Emacs-23 は内部 unicode なので、そもそも区別するのが面倒という理由もありますが...)
0 件のコメント:
コメントを投稿