--- tonyg/rfc4627.erl	2007-02-17 07:17:53.000000000 -0500
+++ atom2json/rfc4627.erl	2007-09-05 02:18:11.000000000 -0400
@@ -109,6 +109,24 @@
     encode_string(Rest, [$", $\\ | Acc]);
 encode_string([$\\ | Rest], Acc) ->
     encode_string(Rest, [$\\, $\\ | Acc]);
+encode_string([X,Y | Rest], Acc) when X >= 16#C2, X =< 16#DF,
+                                      Y >= 16#80, Y =< 16#BF ->
+    <<U:16>> = <<0:5, (X band 16#1F):5, (Y band 16#3F):6>>,
+    encode_string(Rest, encode_general_char(U, Acc));
+encode_string([X,Y,Z | Rest], Acc) when X >= 16#E0, X =< 16#EF,
+                                        Y >= 16#80, Y =< 16#BF,
+                                        Z >= 16#80, Z =< 16#BF ->
+    <<U:16>> = <<(X band 16#F):4, (Y band 16#3F):6, (Z band 16#3F):6>>,
+    encode_string(Rest, encode_general_char(U, Acc));
+encode_string([X,Y,Z,Q | Rest], Acc) when X >= 16#F0, X =< 16#F4,
+                                          Y >= 16#80, Y =< 16#BF,
+                                          Z >= 16#80, Z =< 16#BF,
+                                          Q >= 16#80, Q =< 16#BF ->
+    <<U:32>> = <<0:11, (X band 16#3):3, (Y band 16#3F):6, (Z band 16#3F):6,
+                 (Q band 16#3F):6>>,
+    <<0:12, U1:10, U2:10>> = <<(U - 16#10000) : 32>>,
+    Low = encode_general_char(U2 bor 16#DC00, Acc),
+    encode_string(Rest, encode_general_char(U1 bor 16#D800, Low));
 encode_string([X | Rest], Acc) when X < 32 orelse X > 127 ->
     encode_string(Rest, encode_general_char(X, Acc));
 encode_string([X | Rest], Acc) ->
