diff --git a/lib/gitlab/json.rb b/lib/gitlab/json.rb
index 561cd4509b1ad340cbb657b998b1ccd63440b2e9..767ce310b5a05b737fa86c53b6f3b89ff7e8e39d 100644
--- a/lib/gitlab/json.rb
+++ b/lib/gitlab/json.rb
@@ -242,7 +242,7 @@ class LimitedEncoder
       def self.encode(object, limit: 25.megabytes)
         return ::Gitlab::Json.dump(object) unless Feature.enabled?(:json_limited_encoder)
 
-        buffer = []
+        buffer = StringIO.new
         buffer_size = 0
 
         ::Yajl::Encoder.encode(object) do |data_chunk|
@@ -254,7 +254,7 @@ def self.encode(object, limit: 25.megabytes)
           buffer_size += chunk_size
         end
 
-        buffer.join('')
+        buffer.string
       end
     end
   end
diff --git a/spec/lib/gitlab/json_spec.rb b/spec/lib/gitlab/json_spec.rb
index 42c4b315edf034b56799bff92093a40e604d3bb0..f9f57752b0ab01bd79419bbe30cf55b70669cf30 100644
--- a/spec/lib/gitlab/json_spec.rb
+++ b/spec/lib/gitlab/json_spec.rb
@@ -411,7 +411,7 @@
   end
 
   describe Gitlab::Json::LimitedEncoder do
-    subject { described_class.encode(obj, limit: 8.kilobytes) }
+    subject { described_class.encode(obj, limit: 10.kilobytes) }
 
     context 'when object size is acceptable' do
       let(:obj) { { test: true } }
@@ -431,6 +431,16 @@
       end
     end
 
+    context 'when object contains ASCII-8BIT encoding' do
+      let(:obj) { [{ a: "\x8F" }] * 1000 }
+
+      it 'does not raise encoding error' do
+        expect { subject }.not_to raise_error
+        expect(subject).to be_a(String)
+        expect(subject.size).to eq(10001)
+      end
+    end
+
     context 'when json_limited_encoder is disabled' do
       let(:obj) { [{ test: true }] * 1000 }