From f5809701af8d4f3b52452ea1c943dc97b9a65da6 Mon Sep 17 00:00:00 2001 From: Lamont Granquist Date: Tue, 5 Jan 2016 13:40:08 -0800 Subject: use new ruby #scrub method where available --- lib/ffi_yajl/encoder.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/ffi_yajl/encoder.rb b/lib/ffi_yajl/encoder.rb index 4c3c570..14e3801 100644 --- a/lib/ffi_yajl/encoder.rb +++ b/lib/ffi_yajl/encoder.rb @@ -41,7 +41,15 @@ module FFI_Yajl # call either the ext or ffi hook str = do_yajl_encode(obj, yajl_gen_opts, opts) # we can skip cleaning the whole string for utf-8 issues if we have yajl validate as we go - str.force_encoding("UTF-8").encode!("UTF-8", undef: :replace, invalid: :replace) unless yajl_gen_opts[:yajl_gen_validate_utf8] + + str.force_encoding("UTF-8") + unless yajl_gen_opts[:yajl_gen_validate_utf8] + if str.respond_to?(:scrub) + str.scrub! + else + str.encode!("UTF-8", 'binary', undef: :replace, invalid: :replace) + end + end str end @@ -56,7 +64,12 @@ module FFI_Yajl def self.raise_error_for_status(status, token = nil) # scrub token to valid utf-8 since we may be issuing an exception on an invalid utf-8 token - token = token.to_s.force_encoding("UTF-8").encode("utf-8", undef: :replace, invalid: :replace) + token = token.to_s.force_encoding("UTF-8") + if token.respond_to?(:scrub) + token.scrub! + else + token.encode("utf-8", 'binary', undef: :replace, invalid: :replace) + end case status when 1 # yajl_gen_keys_must_be_strings raise FFI_Yajl::EncodeError, "YAJL internal error: attempted use of non-string object as key" -- cgit v1.2.1