请帮助我理解为什么某些 unicode 字符在某些命令输出中可以在 mintty + tmux 中正确显示,但在其他命令输出中却不行。
示例命令:
for c in 00AE 1F007 1F32D 1F603; do printf '%s\t' "$c"; bash -c "echo -e '\U$c'"; done
unicode-list | grep -aPwi '00AE|1F007|1F32D|1F603'
unicode-list | tac | grep -aPwi '00AE|1F007|1F32D|1F603'
这是我的 Cygwin mintty + zsh(不带 tmux),正确显示四个示例字符:
以下是同一个 mintty 中但在 tmux 内部的相同命令:
因此,在第一个命令 ( bash echo -e
) 中,字符 1F32D 丢失。在第二个命令 ( unicode-list
+ 管道到grep
) 中,1F32D 和 1F603 丢失。再添加一个管道到tac
以反转顺序,00AE 可能也会丢失。
命令unicode-list
是这个脚本:
#!/usr/bin/env bash
# prints UnitCodeData.txt with an additional column containing the actual character.
f=/usr/share/unicode/ucd/UnicodeData.txt
if [ ! -r "$f" ]; then
echo "$f does not exist or is not readable" >&2
exit 2
fi
while IFS= read -r line || [ -s "$line" ]; do
code=${line%;*}
echo -en "\\U$code;"
echo "$line"
done < "$f"
我的配置:
» cygcheck -c tmux
Cygwin Package Information
Package Version Status
tmux 3.2-0 OK
» locale
LANG=en_US.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
我的~/.tmux.conf
:
set -g prefix F4
bind F4 send-prefix
bind F5 copy-mode
set -g set-titles on
set -g set-titles-string '#{pane_title}'
set -g status-fg white
set -g status-bg black
set -g window-status-current-style bg=white,fg=black
set -g window-status-style bg=black,fg=gray
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
# ______________________________________________________________________
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
这里发生了什么?