diff -Nru emacs-21.3.50-20040303.orig/lisp/international/subst-jis.el emacs/lisp/international/subst-jis.el
--- emacs-21.3.50-20040303.orig/lisp/international/subst-jis.el	Thu Oct  2 09:46:22 2003
+++ emacs/lisp/international/subst-jis.el	Sun Jun 20 15:59:59 2004
@@ -50,6 +50,21 @@
      (if (or (and (>= unicode #x2e80) (<= unicode #xd7a3))
 	     (and (>= unicode #xff00) (<= unicode #xffef)))
 	 (puthash unicode  char ucs-unicode-to-mule-cjk))
+     (when utf-decode-to-japanese-symbol
+       (cond ((<= unicode #xff)
+	      (aset ucs-cjk-translation-table
+		    (make-char 'latin-iso8859-1 unicode)
+		    char))
+	     ((<= unicode #x24ff)
+	      (aset ucs-cjk-translation-table
+		    (make-char 'mule-unicode-0100-24ff
+			       (+ (/ (- unicode 256) 96) 32)
+			       (+ (% (- unicode 256) 96) 32))
+		    char))
+	     ((<= unicode #x2e7f)
+	      (puthash unicode char ucs-unicode-to-mule-cjk))
+	     )
+       )
      (puthash char unicode ucs-mule-cjk-to-unicode)))
  '(
    ;; jisx0208
diff -Nru emacs-21.3.50-20040303.orig/lisp/international/utf-16.el emacs/lisp/international/utf-16.el
--- emacs-21.3.50-20040303.orig/lisp/international/utf-16.el	Tue Sep  2 00:45:28 2003
+++ emacs/lisp/international/utf-16.el	Sun Jun 20 15:59:50 2004
@@ -122,7 +122,8 @@
   `(loop
     (read r3 r4)
     (r1 = (r4 <8 r3))
-    ,utf-16-decode-ucs
+    ,@utf-16-decode-ucs
+    (translate-character utf-cjk-translation-table-for-decode r0 r1)
     (translate-character utf-translation-table-for-decode r0 r1)
     (write-multibyte-character r0 r1)
     (repeat)))
@@ -132,6 +133,7 @@
     (read r3 r4)
     (r1 = (r3 <8 r4))
     ,@utf-16-decode-ucs
+    (translate-character utf-cjk-translation-table-for-decode r0 r1)
     (translate-character utf-translation-table-for-decode r0 r1)
     (write-multibyte-character r0 r1)
     (repeat)))
@@ -188,6 +190,7 @@
 	     ,@utf-16-decode-ucs)
 	  ;; R1 a normal Unicode character.
 	  (,@utf-16-decode-ucs
+	   (translate-character utf-cjk-translation-table-for-decode r0 r1)
 	   (translate-character utf-translation-table-for-decode r0 r1)))
 	(write-multibyte-character r0 r1)
 	,utf-16be-decode-loop))))
diff -Nru emacs-21.3.50-20040303.orig/lisp/international/utf-8.el emacs/lisp/international/utf-8.el
--- emacs-21.3.50-20040303.orig/lisp/international/utf-8.el	Thu Oct  2 09:49:04 2003
+++ emacs/lisp/international/utf-8.el	Sun Jun 20 15:59:43 2004
@@ -112,6 +112,10 @@
 (define-translation-hash-table 'utf-subst-table-for-decode
   ucs-unicode-to-mule-cjk)
 
+(defvar ucs-cjk-translation-table (make-char-table 'translation-table nil))
+
+(define-translation-table 'utf-cjk-translation-table-for-decode)
+
 (mapc
  (lambda (pair)
    (aset utf-fragmentation-table (car pair) (cdr pair))
@@ -190,6 +194,14 @@
   :type 'boolean
   :group 'mule)
 
+(defcustom utf-decode-to-japanese-symbol nil
+  "Whether or not to decode some Unicode symbols to Japanese JIS characters.
+This variable has no effect until utf-translate-cjk-mode is turned on."
+  :version "21.4"
+  :type 'boolean
+  :group 'mule)
+;; Future: utf-use-{chinese-gb,chinese-big5,korean}-symbol
+
 (define-minor-mode utf-translate-cjk-mode
   "Whether the UTF based coding systems should decode/encode CJK characters.
 Enabling this loads tables which allow the coding systems mule-utf-8,
@@ -222,6 +234,8 @@
 	      (make-hash-table :test 'eq :size 43000 :rehash-size 1000)
 	      ucs-unicode-to-mule-cjk
 	      (make-hash-table :test 'eq :size 21500 :rehash-size 1000))
+	(setq ucs-cjk-translation-table
+	      (make-char-table 'translation-table nil))
 	;; Load the files explicitly, to avoid having to keep
 	;; around the large tables they contain (as well as the
 	;; ones which get built).
@@ -250,6 +264,9 @@
 	  ucs-unicode-to-mule-cjk)
 	(define-translation-hash-table 'utf-subst-table-for-encode
 	  ucs-mule-cjk-to-unicode)
+        (define-translation-table 'utf-cjk-translation-table-for-decode
+	  ucs-cjk-translation-table)
+	;; I don't know what is the purpose of following code.
 	(set-char-table-extra-slot (get 'utf-translation-table-for-encode
 					'translation-table)
 				   1 ucs-mule-cjk-to-unicode))
@@ -257,6 +274,7 @@
       (make-hash-table :test 'eq))
     (define-translation-hash-table 'utf-subst-table-for-encode
       (make-hash-table :test 'eq))
+    (define-translation-table 'utf-cjk-translation-table-for-decode)
     (set-char-table-extra-slot (get 'utf-translation-table-for-encode
 				    'translation-table)
 			       1 nil)))
@@ -346,6 +364,8 @@
 			 (r1 %= 96)
 			 (r1 += (r2 + 32))
 			 (translate-character
+			  utf-cjk-translation-table-for-decode r0 r1)
+			 (translate-character
 			  utf-translation-table-for-decode r0 r1)
 			 (write-multibyte-character r0 r1))))))))
 
@@ -393,6 +413,8 @@
 			 (r1 = (r7 + 32))
 			 (r1 += ((r3 + 32) << 7))
 			 (translate-character
+			  utf-cjk-translation-table-for-decode r0 r1)
+			 (translate-character
 			  utf-translation-table-for-decode r0 r1)
 			 (write-multibyte-character r0 r1))
 
@@ -546,12 +568,12 @@
      (loop
       (if (r5 < 0)
 	  ((r1 = -1)
-	   (read-multibyte-character r0 r1)
-	   (translate-character utf-translation-table-for-encode r0 r1))
+	   (read-multibyte-character r0 r1))
 	(;; We have already done read-multibyte-character.
 	 (r0 = r5)
 	 (r1 = r6)
 	 (r5 = -1)))
+      (translate-character utf-translation-table-for-encode r0 r1)
 
       (if (r0 == ,(charset-id 'ascii))
 	  (write r1)
