diff --git a/starlette/testclient.py b/starlette/testclient.py index 4a750cd8c..60ef322d1 100644 --- a/starlette/testclient.py +++ b/starlette/testclient.py @@ -147,7 +147,7 @@ def send_bytes(self, data: bytes) -> None: def send_json(self, data: typing.Any, mode: str = "text") -> None: assert mode in ["text", "binary"] - text = json.dumps(data, separators=(",", ":")) + text = json.dumps(data, separators=(",", ":"), ensure_ascii=False) if mode == "text": self.send({"type": "websocket.receive", "text": text}) else: diff --git a/starlette/websockets.py b/starlette/websockets.py index 859560857..a34bc1339 100644 --- a/starlette/websockets.py +++ b/starlette/websockets.py @@ -168,7 +168,7 @@ async def send_bytes(self, data: bytes) -> None: async def send_json(self, data: typing.Any, mode: str = "text") -> None: if mode not in {"text", "binary"}: raise RuntimeError('The "mode" argument should be "text" or "binary".') - text = json.dumps(data, separators=(",", ":")) + text = json.dumps(data, separators=(",", ":"), ensure_ascii=False) if mode == "text": await self.send({"type": "websocket.send", "text": text}) else: diff --git a/tests/test_websockets.py b/tests/test_websockets.py index 65e16671d..2b487633e 100644 --- a/tests/test_websockets.py +++ b/tests/test_websockets.py @@ -39,6 +39,24 @@ async def app(scope: Scope, receive: Receive, send: Send) -> None: assert data == {"test": "data"} +def test_websocket_ensure_unicode_on_send_json( + test_client_factory: Callable[..., TestClient] +): + async def app(scope: Scope, receive: Receive, send: Send) -> None: + websocket = WebSocket(scope, receive=receive, send=send) + + await websocket.accept() + message = await websocket.receive_json(mode="text") + await websocket.send_json(message, mode="text") + await websocket.close() + + client = test_client_factory(app) + with client.websocket_connect("/123?a=abc") as websocket: + websocket.send_json({"test": "数据"}, mode="text") + data = websocket.receive_text() + assert data == '{"test":"数据"}' + + def test_websocket_query_params(test_client_factory): async def app(scope: Scope, receive: Receive, send: Send) -> None: websocket = WebSocket(scope, receive=receive, send=send)