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; }