diff --git a/packages/react-dom/src/__tests__/ReactDOMFizzServerNode-test.js b/packages/react-dom/src/__tests__/ReactDOMFizzServerNode-test.js
index 2f0d5bb98ce00..11c7043e2b9de 100644
--- a/packages/react-dom/src/__tests__/ReactDOMFizzServerNode-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMFizzServerNode-test.js
@@ -635,4 +635,17 @@ describe('ReactDOMFizzServerNode', () => {
expect(rendered).toBe(false);
expect(isComplete).toBe(true);
});
+
+ it('should encode multibyte characters correctly without nulls (#24985)', () => {
+ const {writable, output} = getTestWritable();
+ const {pipe} = ReactDOMFizzServer.renderToPipeableStream(
+
{Array(700).fill('ののの')}
,
+ );
+ pipe(writable);
+ jest.runAllTimers();
+ expect(output.result.indexOf('\u0000')).toBe(-1);
+ expect(output.result).toEqual(
+ '' + Array(700).fill('ののの').join('') + '
',
+ );
+ });
});
diff --git a/packages/react-server/src/ReactServerStreamConfigNode.js b/packages/react-server/src/ReactServerStreamConfigNode.js
index 807dafe5edf6e..16a773314d679 100644
--- a/packages/react-server/src/ReactServerStreamConfigNode.js
+++ b/packages/react-server/src/ReactServerStreamConfigNode.js
@@ -75,12 +75,14 @@ function writeStringChunk(destination: Destination, stringChunk: string) {
writtenBytes += written;
if (read < stringChunk.length) {
- writeToDestination(destination, (currentView: any));
+ writeToDestination(
+ destination,
+ (currentView: any).subarray(0, writtenBytes),
+ );
currentView = new Uint8Array(VIEW_SIZE);
writtenBytes = textEncoder.encodeInto(
stringChunk.slice(read),
- // $FlowFixMe[incompatible-call] found when upgrading Flow
- currentView,
+ (currentView: any),
).written;
}