Thai combining marks cause width miscalculation in modern terminals (Kitty, Ghostty)
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 52/100
Hướng nghiên cứu
Start by inspecting the Thai ranges in _cell_widths.py, then run the supplied Console, Table, and cell_len reproduction with the listed Thai strings. Done means the reported Thai cell lengths match the terminal widths in Kitty and Ghostty, with table columns no longer misaligned.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Problem
Thai combining marks (vowels and tone marks) are marked as zero-width in CELL_WIDTHS, following Unicode's Mn (Nonspacing Mark) classification. However, modern terminal emulators (tested: Kitty, Ghostty) render Thai text with these characters taking visible width, causing table columns and other layouts to misalign.
Reproduction
from rich.console import Console
from rich.table import Table
from rich.cells import cell_len
console = Console()
table = Table(title='Thai Text Width Test')
table.add_column('Text', width=10)
table.add_column('cell_len')
for text in ['สวัสดี', 'น้ำ', 'กรุงเทพ']:
table.add_row(text, str(cell_len(text)))
console.print(table)
Width Analysis
| Text | Codepoints | Combining marks | Rich cell_len | Terminal width |
|---|---|---|---|---|
| สวัสดี | 6 | 2 | 4 | 6 |
| น้ำ | 3 | 1 | 2 | 3 |
| กรุงเทพ | 7 | 1 | 6 | 7 |
The discrepancy equals the number of combining marks — terminals render each Thai codepoint as width 1.
Affected Ranges in CELL_WIDTHS
| Range | Characters | Unicode Category |
|---|---|---|
| U+0E31 | ั | Mn (sara am vowel) |
| U+0E34-U+0E3A | ิ ี ึ ื ุ ู ฺ | Mn (vowel signs) |
| U+0E47-U+0E4E | ็ ่ ้ ๊ ๋ ์ ํ ๎ | Mn (tone marks) |
Environment
- Rich: 13.7.1
- Python: 3.14.2
- Terminals tested:
- Kitty 0.45.0 — affected
- Ghostty 1.2.3 — affected
- Platform: macOS
Proposed Fix
Change Thai combining mark ranges from width 0 to width 1 in _cell_widths.py. This matches actual terminal rendering behavior for Thai script.
- Ngôn ngữ chính
- Python
- Star
- 57.5k
- Fork
- 2.4k
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Textualize/rich
-
[BUG] Text.wrap(console, width=0) raises ValueError in chop_cells (range step 0)Có thể làm lại được @UzairRehman4 đã nhận 9 ngày trước và không có pull request nào đang mở. Đang mở
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 88/100
Textualize/rich#4234 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
Textualize/rich#4229 · 5 bình luận ·
-
[BUG] Traceback rendering fails on ParseError with a non-string messageCó thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
Textualize/rich#4225 · 4 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
Textualize/rich#4223 · 1 bình luận ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 88/100
Textualize/rich#4222 · 1 bình luận ·
Tất cả issue của Textualize/rich
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Graphify-Labs/graphify#4524 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
topoteretes/cognee#5982 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Patches of derivations with `__structuredAttrs` are ignoredCó thể đã có người làm @KiaraGrouwstra đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 81/100
nix-community/vulnix#184 ·
-
New InternshipĐang mởnew_internship
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 65/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 64/100
aws-samples/sample-per-model-bedrock#295 ·
Maintainer thường phản hồi trong vòng 1 ngày