diff --git a/src/clj/cljs/compiler.clj b/src/clj/cljs/compiler.clj
index 8466954..320f2a0 100644
--- a/src/clj/cljs/compiler.clj
+++ b/src/clj/cljs/compiler.clj
@@ -159,25 +159,34 @@
 (defmethod emit-constant Long [x] (print x))
 (defmethod emit-constant Integer [x] (print x)) ; reader puts Integers in metadata
 (defmethod emit-constant Double [x] (print x))
-(defmethod emit-constant String [x] (pr x))
+(defmethod emit-constant String [x]
+  (print (string/escape (pr-str x) ;pr-str escapes control characters like line-feeds and surrounds the string with double quotes
+                        {\uFDD0 "\\uFDD0"
+                         \uFDD1 "\\uFDD1"})))
 (defmethod emit-constant Boolean [x] (print (if x "true" "false")))
-(defmethod emit-constant Character [x] (pr (str x)))
+(defmethod emit-constant Character [x]
+  (case x
+    \uFDD0 (print "\"\\uFDD0\"")
+    \uFDD1 (print "\"\\uFDD1\"")
+    (pr (str x))))
 
 (defmethod emit-constant java.util.regex.Pattern [x]
   (let [[_ flags pattern] (re-find #"^(?:\(\?([idmsux]*)\))?(.*)" (str x))]
     (print (str \/ (.replaceAll (re-matcher #"/" pattern) "\\\\/") \/ flags))))
 
 (defmethod emit-constant clojure.lang.Keyword [x]
-           (pr (str \uFDD0 \'
-                    (if (namespace x)
-                      (str (namespace x) "/") "")
-                    (name x))))
+           (print (str \" "\\uFDD0" \'
+                       (if (namespace x)
+                         (str (namespace x) "/") "")
+                       (name x)
+                       \")))
 
 (defmethod emit-constant clojure.lang.Symbol [x]
-           (pr (str \uFDD1 \'
+           (print (str \" "\\uFDD1" \'
                     (if (namespace x)
                       (str (namespace x) "/") "")
-                    (name x))))
+                    (name x)
+                    \")))
 
 (defn- emit-meta-constant [x string]
   (if (meta x)
