From 2ace57404b72a40466ce1d55b28e57c5e8b4be44 Mon Sep 17 00:00:00 2001 From: Lev Date: Thu, 3 Jul 2025 12:42:40 +0200 Subject: [PATCH] fix: properly handle utf-8 in diff highlighting (#585) --- packages/tui/internal/components/diff/diff.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/tui/internal/components/diff/diff.go b/packages/tui/internal/components/diff/diff.go index 02c2c31e..03f58cc2 100644 --- a/packages/tui/internal/components/diff/diff.go +++ b/packages/tui/internal/components/diff/diff.go @@ -10,6 +10,7 @@ import ( "strconv" "strings" "sync" + "unicode/utf8" "github.com/alecthomas/chroma/v2" "github.com/alecthomas/chroma/v2/formatters" @@ -575,7 +576,10 @@ func applyHighlighting(content string, segments []Segment, segmentType LineType, ansiSequences[visibleIdx] = lastAnsiSeq } visibleIdx++ - i++ + + // Properly advance by UTF-8 rune, not byte + _, size := utf8.DecodeRuneInString(content[i:]) + i += size } // Apply highlighting @@ -622,8 +626,9 @@ func applyHighlighting(content string, segments []Segment, segmentType LineType, } } - // Get current character - char := string(content[i]) + // Get current character (properly handle UTF-8) + r, size := utf8.DecodeRuneInString(content[i:]) + char := string(r) if inSelection { // Get the current styling @@ -657,7 +662,7 @@ func applyHighlighting(content string, segments []Segment, segmentType LineType, } currentPos++ - i++ + i += size } return sb.String()