◐ Shell
clean mode source ↗

util: fix Latin1 decoding to return string output · nodejs/node@1381541

Original file line numberDiff line numberDiff line change

@@ -286,9 +286,11 @@ void BindingData::DecodeLatin1(const FunctionCallbackInfo<Value>& args) {

286286

env->isolate(), "The encoded data was not valid for encoding latin1");

287287

}

288288
289-

Local<Object> buffer_result =

290-

node::Buffer::Copy(env, result.c_str(), written).ToLocalChecked();

291-

args.GetReturnValue().Set(buffer_result);

289+

Local<String> output =

290+

String::NewFromUtf8(

291+

env->isolate(), result.c_str(), v8::NewStringType::kNormal, written)

292+

.ToLocalChecked();

293+

args.GetReturnValue().Set(output);

292294

}

293295
294296

} // namespace encoding_binding

Original file line numberDiff line numberDiff line change

@@ -26,7 +26,7 @@ bool RunDecodeLatin1(Environment* env,

2626

return false;

2727

}

2828
29-

*result = try_catch.Exception();

29+

*result = args[0];

3030

return true;

3131

}

3232

@@ -151,5 +151,26 @@ TEST_F(EncodingBindingTest, DecodeLatin1_BOMPresent) {

151151

EXPECT_STREQ(*utf8_result, "Áéó");

152152

}

153153
154+

TEST_F(EncodingBindingTest, DecodeLatin1_ReturnsString) {

155+

Environment* env = CreateEnvironment();

156+

Isolate* isolate = env->isolate();

157+

HandleScope handle_scope(isolate);

158+
159+

const uint8_t latin1_data[] = {0xC1, 0xE9, 0xF3};

160+

Local<ArrayBuffer> ab = ArrayBuffer::New(isolate, sizeof(latin1_data));

161+

memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data));

162+
163+

Local<Uint8Array> array = Uint8Array::New(ab, 0, sizeof(latin1_data));

164+

Local<Value> args[] = {array};

165+
166+

Local<Value> result;

167+

ASSERT_TRUE(RunDecodeLatin1(env, args, false, false, &result));

168+
169+

ASSERT_TRUE(result->IsString());

170+
171+

String::Utf8Value utf8_result(isolate, result);

172+

EXPECT_STREQ(*utf8_result, "Áéó");

173+

}

174+
154175

} // namespace encoding_binding

155176

} // namespace node

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,17 @@

1+

'use strict';

2+
3+

const common = require('../common');

4+
5+

const test = require('node:test');

6+

const assert = require('node:assert');

7+
8+

test('TextDecoder correctly decodes windows-1252 encoded data', { skip: !common.hasIntl }, () => {

9+

const latin1Bytes = new Uint8Array([0xc1, 0xe9, 0xf3]);

10+
11+

const expectedString = 'Áéó';

12+
13+

const decoder = new TextDecoder('windows-1252');

14+

const decodedString = decoder.decode(latin1Bytes);

15+
16+

assert.strictEqual(decodedString, expectedString);

17+

});