From c0b7a2d09f0f4204bffff9a6aaa4af742ef7b1a6 Mon Sep 17 00:00:00 2001 From: Varun Chawla Date: Sun, 22 Feb 2026 20:16:12 -0800 Subject: [PATCH 1/2] fix(v2): set LANG=en_US.UTF-8 for pbpaste/pbcopy on macOS When macOS apps are launched as standalone (not from terminal), the LANG environment variable is unset. This causes pbpaste to default to an ASCII-compatible encoding, resulting in mojibake for non-ASCII clipboard content. Fix by ensuring LANG=en_US.UTF-8 is set in the command environment when it's not already present. Fixes #4132 --- .../frontend/desktop/darwin/clipboard.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/v2/internal/frontend/desktop/darwin/clipboard.go b/v2/internal/frontend/desktop/darwin/clipboard.go index c40ba877175..d067e0b64ab 100644 --- a/v2/internal/frontend/desktop/darwin/clipboard.go +++ b/v2/internal/frontend/desktop/darwin/clipboard.go @@ -3,11 +3,27 @@ package darwin import ( + "os" "os/exec" ) +// ensureUTF8Env returns the current environment with LANG set to en_US.UTF-8 +// if it is not already set. This is needed because packaged macOS apps do not +// inherit the terminal's LANG variable, causing pbpaste/pbcopy to default to +// an ASCII-compatible encoding that mangles non-ASCII text. +func ensureUTF8Env() []string { + env := os.Environ() + for _, e := range env { + if len(e) > 5 && e[:5] == "LANG=" { + return env + } + } + return append(env, "LANG=en_US.UTF-8") +} + func (f *Frontend) ClipboardGetText() (string, error) { pasteCmd := exec.Command("pbpaste") + pasteCmd.Env = ensureUTF8Env() out, err := pasteCmd.Output() if err != nil { return "", err @@ -17,6 +33,7 @@ func (f *Frontend) ClipboardGetText() (string, error) { func (f *Frontend) ClipboardSetText(text string) error { copyCmd := exec.Command("pbcopy") + copyCmd.Env = ensureUTF8Env() in, err := copyCmd.StdinPipe() if err != nil { return err From b34587efdacf164141ddea43598102b88206dcb3 Mon Sep 17 00:00:00 2001 From: Varun Chawla Date: Sun, 22 Feb 2026 20:42:00 -0800 Subject: [PATCH 2/2] fix: use os.LookupEnv for LANG check in ensureUTF8Env Replace manual string slicing with os.LookupEnv which is more idiomatic and correctly handles the edge case where LANG is set to an empty string. --- v2/internal/frontend/desktop/darwin/clipboard.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/v2/internal/frontend/desktop/darwin/clipboard.go b/v2/internal/frontend/desktop/darwin/clipboard.go index d067e0b64ab..ffeaa217541 100644 --- a/v2/internal/frontend/desktop/darwin/clipboard.go +++ b/v2/internal/frontend/desktop/darwin/clipboard.go @@ -13,12 +13,10 @@ import ( // an ASCII-compatible encoding that mangles non-ASCII text. func ensureUTF8Env() []string { env := os.Environ() - for _, e := range env { - if len(e) > 5 && e[:5] == "LANG=" { - return env - } + if _, ok := os.LookupEnv("LANG"); !ok { + env = append(env, "LANG=en_US.UTF-8") } - return append(env, "LANG=en_US.UTF-8") + return env } func (f *Frontend) ClipboardGetText() (string, error) {