[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

Re: how to setuo Mule-UCS



こんにちは。chiyu@ふくおか、といいます。

中国語の hz という文字コードの設定
c:/meadow/1.10/lisp/language/ 内の china-util.el と chinese.el
を眺めていたら、JAVAのユニコードエスケープを
新しい文字コードとして定義する方法がわかりました。

以下のelispをロードして、
C-x C-m c java-unicode-escapes <RETURN> C-x C-f ファイル名 <RETURN>
で開けるはずです。

環境は、Meadow1.10 + Mule-UCS-0.62 です。

以上。失礼しました。
chiyu(あかば のぶゆき)

;以下、cgreek-emacs20、chinese.el、china-util.elを参考にした。
(defun mule-to-UE-region (beg end)
  "Convert multilingual characters in the region into Unicode Escapes notation."
  (interactive "*r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end) ;ナローイング
      (mule-to-UE-buffer))))

(defun mule-to-UE-buffer nil ;Mule-UCS-0.62/lisp/un-define.el内のchar-to-ucsを使用
  "Convert multilingual characters in the current buffer into Unicode Escapes notation."
  (interactive "*")
  (save-excursion
    (save-restriction
      (let (ch ch-id)
        (goto-char (point-min)) ;バッファの先頭へ
        (while (not (eobp)) ;バッファの最後でない間、
          (setq ch (following-char)) ;ポイント位置の文字コード
          (setq ch-id (nth 0 (split-char ch))) ;その文字のleading-charcter
          (if (not (eq 'ascii ch-id)) ;その文字がASCIIでなければ、
              (progn
                (insert (concat "\\u" (format "%04x" (char-to-ucs ch)))) 
                                        ;Unicode番号に変換
                (delete-char 1)) ;その文字自身(ch)を削除
            (forward-char 1))))))) ;ASCIIな場合は、そのまま次の文字へ。

(defun UE-to-mule-region (beg end)
  "Convert the region from Unicode Escapes notation into mule characters."
  (interactive "*r")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end) ;ナローイング
      (UE-to-mule-buffer))))

(defun UE-to-mule-buffer nil ;Mule-UCS-0.62/lisp/un-define.el内のucs-to-charを使用
  "Convert the current buffer from Unicode Escapes notation into mule characters.
Return the length of resulting text."
  (interactive "*")
  (save-excursion
    (save-restriction
      (let (ucs-number)
        (goto-char (point-min)) ;バッファの先頭へ。
        (while (re-search-forward "\\\\u\\([0-9a-f][0-9a-f][0-9a-f][0-9a-f]\\)" nil t)
                                        ;JavaのUnicode Escapesを探す。
          (setq ucs-number (string-to-number 
                            (buffer-substring (match-beginning 1) (match-end 1)) 16))
          (replace-match "")
          (insert-char (ucs-to-char ucs-number) 1))) ;それをMule内部の文字に変換
      (- (point-max) (point-min))))) ;変換結果の文字長を返り値にする。重要!!!

(make-coding-system
 'java-unicode-escapes 0 ?U
 "JAVA Unicode Escapes"
 nil
 '((safe-charsets . t)
   (post-read-conversion . post-read-decode-java-unicode-escapes)
   (pre-write-conversion . pre-write-encode-java-unicode-escapes)))

(defun post-read-decode-java-unicode-escapes (len)
  (let ((pos (point))
	(buffer-modified-p (buffer-modified-p))
	last-coding-system-used)
    (prog1
	(UE-to-mule-region pos (+ pos len))
      (set-buffer-modified-p buffer-modified-p))))

(defun pre-write-encode-java-unicode-escapes (from to)
  (let ((buf (current-buffer)))
    (set-buffer (generate-new-buffer " *temp*"))
    (if (stringp from)
	(insert from)
      (insert-buffer-substring buf from to))
    (let (last-coding-system-used)
      (mule-to-UE-region 1 (point-max)))
    nil))