--- 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 -> + <> = <<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 -> + <> = <<(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 -> + <> = <<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) ->