From b682ec3bbe8716d7c9710f64be3075b08fd2eece Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 14:45:30 +0900 Subject: [PATCH] Fix `str.zfill()` width calculation for non-ASCII strings (#7534) --- crates/vm/src/anystr.rs | 4 ++++ extra_tests/snippets/builtin_str.py | 3 +++ 2 files changed, 7 insertions(+) diff --git a/crates/vm/src/anystr.rs b/crates/vm/src/anystr.rs index 79b62a58a..a9369bf06 100644 --- a/crates/vm/src/anystr.rs +++ b/crates/vm/src/anystr.rs @@ -396,6 +396,10 @@ pub trait AnyStr { fn py_zfill(&self, width: isize) -> Vec { let width = width.to_usize().unwrap_or(0); + let char_len = self.elements().count(); + let width = self + .bytes_len() + .saturating_add(width.saturating_sub(char_len)); rustpython_common::str::zfill(self.as_bytes(), width) } diff --git a/extra_tests/snippets/builtin_str.py b/extra_tests/snippets/builtin_str.py index 415156184..12f97ac61 100644 --- a/extra_tests/snippets/builtin_str.py +++ b/extra_tests/snippets/builtin_str.py @@ -61,6 +61,9 @@ assert a.endswith(("A", "lo")) assert not a.endswith("on") assert not a.endswith(("A", "ll")) assert a.zfill(8) == "000Hallo" +assert "รก".zfill(4) == "000รก" +assert "๐Ÿ™‚".zfill(5) == "0000๐Ÿ™‚" +assert "+ใ‚".zfill(5) == "+000ใ‚" assert a.isalnum() assert not a.isdigit() assert not a.isdecimal()