Project

General

Profile

Actions

Bug #10705

closed

JSON::ParserError#message is wrong encoding (ASCII-8BIT)

Added by josh.cheek (Josh Cheek) over 7 years ago. Updated almost 7 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.3.0dev (2015-01-06 trunk 49159) [x86_64-darwin13]
[ruby-core:67386]

Description

JSON::ParserError#message is wrong encoding (ASCII-8BIT). I would expect the error to be whatever the internal encoding is (in my case, utf8), perhaps inspecting the string in the error message such that all characters would be valid in that encoding.

Here is an example of where it becomes an issue:

# encoding: utf-8
require 'json'  # => true

json = JSON.dump("√")                                          # => "\"√\""
begin
  result = JSON.parse(json)
  puts "PARSED: #{result.inspect}"
rescue JSON::ParserError => e
  `ruby -v`                                                    # => "ruby 2.3.0dev (2015-01-06 trunk 49159) [x86_64-darwin13]\n"
  json.encoding                                                # => #<Encoding:UTF-8>
  e.message.encoding                                           # => #<Encoding:ASCII-8BIT>
  e.message                                                    # => "757: unexpected token at '\"\xE2\x88\x9A\"'"
  puts "Could not parse #{json.inspect} because #{e.message}"  # ~> Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
end

# ~> Encoding::CompatibilityError
# ~> incompatible character encodings: UTF-8 and ASCII-8BIT
# ~>
# ~> f9.rb:13:in `rescue in <main>'
# ~> f9.rb:5:in `<main>'

If the parsed string doesn't have a multibyte unicode character, it still happens, but fixes itself when it comes in contact with another string, since all its bytes are within the ASCII range.

Documented the actual use case and debugging here.

(side thought: should I open another bug since it generates invalid JSON?)

Actions

Also available in: Atom PDF