Skip to content

Commit 100e302

Browse files
committed
Properly handle UTF-8 keys and values
1 parent e6c9ec6 commit 100e302

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

ext/fast_jsonparser/fast_jsonparser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static VALUE make_ruby_object(dom::element element)
2727
for (dom::key_value_pair field : dom::object(element))
2828
{
2929
std::string_view view(field.key);
30-
VALUE k = rb_intern(view.data());
30+
VALUE k = rb_intern_str(rb_utf8_str_new(view.data(), view.size()));
3131
VALUE v = make_ruby_object(field.value);
3232
rb_hash_aset(hash, ID2SYM(k), v);
3333
}
@@ -48,7 +48,7 @@ static VALUE make_ruby_object(dom::element element)
4848
case dom::element_type::STRING:
4949
{
5050
std::string_view view(element);
51-
return rb_str_new(view.data(), view.size());
51+
return rb_utf8_str_new(view.data(), view.size());
5252
}
5353
case dom::element_type::BOOL:
5454
{

test/fast_jsonparser_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ def test_that_it_has_a_version_number
77
refute_nil ::FastJsonparser::VERSION
88
end
99

10+
def test_string_encoding
11+
result = FastJsonparser.parse('"École"')
12+
assert_equal Encoding::UTF_8, result.encoding
13+
end
14+
15+
def test_symbols_encoding
16+
hash = FastJsonparser.parse('{"École": 1}')
17+
assert_includes hash, :"École"
18+
assert_equal Encoding::UTF_8, hash.keys.first.encoding
19+
end
20+
1021
def test_json_load_from_file_is_working
1122
result = FastJsonparser.load("./benchmark/graduation.json")
1223
assert_equal result[:meta].length, 1

0 commit comments

Comments
 (0)