diff --git i/ext/json/generator/generator.c w/ext/json/generator/generator.c index b1babb1..c282515 100644 --- i/ext/json/generator/generator.c +++ w/ext/json/generator/generator.c @@ -16,7 +16,7 @@ static ID i_to_s, i_to_json, i_new, i_indent, i_space, i_space_before, i_object_nl, i_array_nl, i_max_nesting, i_allow_nan, i_ascii_only, i_quirks_mode, i_pack, i_unpack, i_create_id, i_extend, i_key_p, i_aref, i_send, i_respond_to_p, i_match, i_keys, i_depth, - i_buffer_initial_length, i_dup; + i_buffer_initial_length, i_dup, i_valid_encoding_p; /* * Copyright 2001-2004 Unicode, Inc. @@ -726,11 +726,13 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St static void generate_json_string(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj) { + int ascii = state->ascii_only; fbuffer_append_char(buffer, '"'); #ifdef HAVE_RUBY_ENCODING_H obj = rb_funcall(obj, i_encode, 1, CEncoding_UTF_8); + if (!ascii && !RTEST(rb_funcall(obj, i_valid_encoding_p, 0, 0))) ascii = 1; #endif - if (state->ascii_only) { + if (ascii) { convert_UTF8_to_JSON_ASCII(buffer, obj); } else { convert_UTF8_to_JSON(buffer, obj); @@ -1387,6 +1389,7 @@ void Init_generator() CEncoding_UTF_8 = rb_funcall(rb_path2class("Encoding"), rb_intern("find"), 1, rb_str_new2("utf-8")); i_encoding = rb_intern("encoding"); i_encode = rb_intern("encode"); + i_valid_encoding_p = rb_intern("valid_encoding?"); #endif i_SAFE_STATE_PROTOTYPE = rb_intern("SAFE_STATE_PROTOTYPE"); CJSON_SAFE_STATE_PROTOTYPE = Qnil;