module JSON::TruffleRuby::Generator
def self.utf8_to_json(string, script_safe = false) # :nodoc:
UTF16 big endian characters as \u????, and return it.
Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
def self.utf8_to_json(string, script_safe = false) # :nodoc: if script_safe if SCRIPT_SAFE_ESCAPE_PATTERN.match?(string) string.gsub(SCRIPT_SAFE_ESCAPE_PATTERN, SCRIPT_SAFE_MAP) else string end else if /["\\\x0-\x1f]/.match?(string) string.gsub(/["\\\x0-\x1f]/, MAP) else string end end end
def self.utf8_to_json_ascii(original_string, script_safe = false) # :nodoc:
def self.utf8_to_json_ascii(original_string, script_safe = false) # :nodoc: string = original_string.b map = script_safe ? SCRIPT_SAFE_MAP : MAP string.gsub!(/[\/"\\\x0-\x1f]/n) { map[$&] || $& } string.gsub!(/( (?: [\xc2-\xdf][\x80-\xbf] | [\xe0-\xef][\x80-\xbf]{2} | [\xf0-\xf4][\x80-\xbf]{3} )+ | [\x80-\xc1\xf5-\xff] # invalid )/nx) { |c| c.size == 1 and raise GeneratorError.new("invalid utf8 byte: '#{c}'", original_string) s = c.encode(::Encoding::UTF_16BE, ::Encoding::UTF_8).unpack('H*')[0] s.force_encoding(::Encoding::BINARY) s.gsub!(/.{4}/n, '\\\\u\&') s.force_encoding(::Encoding::UTF_8) } string.force_encoding(::Encoding::UTF_8) string rescue => e raise GeneratorError.new(e.message, original_string) end
def self.valid_utf8?(string)
def self.valid_utf8?(string) encoding = string.encoding (encoding == Encoding::UTF_8 || encoding == Encoding::ASCII) && string.valid_encoding? end