From 2e9062fab321df5f64de8f56ac78884c1085abe4 Mon Sep 17 00:00:00 2001 From: Jiajun Xie Date: Mon, 6 Apr 2026 21:36:10 +0800 Subject: [PATCH] Fix: handle surrogate pairs in FileHistory.store_string FileHistory.store_string crashes with UnicodeEncodeError when the input string contains surrogate pairs (e.g., from Windows clipboard containing emoji). Add errors='replace' to gracefully handle invalid surrogates by replacing them with the Unicode replacement character. Fixes #2061 --- src/prompt_toolkit/history.py | 2 +- src/prompt_toolkit/widgets/base.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/prompt_toolkit/history.py b/src/prompt_toolkit/history.py index 764a8d657..662e10460 100644 --- a/src/prompt_toolkit/history.py +++ b/src/prompt_toolkit/history.py @@ -300,7 +300,7 @@ def store_string(self, string: str) -> None: with open(self.filename, "ab") as f: def write(t: str) -> None: - f.write(t.encode("utf-8")) + f.write(t.encode("utf-8", errors="replace")) write(f"\n# {datetime.datetime.now()}\n") for line in string.split("\n"): diff --git a/src/prompt_toolkit/widgets/base.py b/src/prompt_toolkit/widgets/base.py index d2bcacf2e..6c59fa8ea 100644 --- a/src/prompt_toolkit/widgets/base.py +++ b/src/prompt_toolkit/widgets/base.py @@ -209,7 +209,7 @@ def __init__( if input_processors is None: input_processors = [] - # Writeable attributes. + # Writable attributes. self.completer = completer self.complete_while_typing = complete_while_typing self.lexer = lexer