diff --git a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts index dc130b1c70..670f533681 100644 --- a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts +++ b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts @@ -52,7 +52,7 @@ async function fetchServerAction( headers: { Accept: RSC_CONTENT_TYPE_HEADER, 'Next-Action': actionId, - [NEXT_ROUTER_STATE_TREE]: JSON.stringify(state.tree), + [NEXT_ROUTER_STATE_TREE]: encodeURIComponent(JSON.stringify(state.tree)), ...(process.env.__NEXT_ACTIONS_DEPLOYMENT_ID && process.env.NEXT_DEPLOYMENT_ID ? { diff --git a/test/e2e/app-dir/actions/app-action.test.ts b/test/e2e/app-dir/actions/app-action.test.ts index 67ea65a9c5..e4a90cefeb 100644 --- a/test/e2e/app-dir/actions/app-action.test.ts +++ b/test/e2e/app-dir/actions/app-action.test.ts @@ -393,6 +393,16 @@ createNextDescribe( return newTestCookie !== currentTestCookie ? 'success' : 'failure' }, 'success') }) + + it('should handle unicode search params', async () => { + const browser = await next.browser('/server?name=名') + + const cnt = await browser.elementByCss('h1').text() + expect(cnt).toBe('0') + + await browser.elementByCss('#inc').click() + await check(() => browser.elementByCss('h1').text(), '1') + }) }) describe('fetch actions', () => {