我正在运行一个全新安装的 Arch,启动设置如下(简化):
.zprofile
->exec startx
# 仅startx
在此处调用.xinit
->exec bspwm
# xinit 是默认的,末尾添加了/etc/X11/xinit/xinitrc
一行exec
.bspwmrc
->echo -e '\uf073' > ~/log.txt
启动后,如果我检查内容,~/log.txt
我会看到\uF073
(注意:大写 F)。如果我在启动后在 、 中运行相同的 echo 命令sh
,bash
它zsh
会打印正确的unicode字符。
重建字体缓存没有帮助。
我认为字体还没有那么早就准备好,并且我之前添加了睡眠,但没有什么区别。
编辑 (1):从另一个没有 X 的 tty 运行相同的 echo 会产生相同的\uF073
结果,即从我的 tty 运行 echo.bspwmrc
太早了。但是有什么好方法可以解决这个问题呢?文档说bspwm
从xinitrc
如果这有关系的话,该进程正在我的用户下运行。
我现在有点困惑,希望得到一些帮助。
谢谢
答案1
Arch 特定的(?) 解决方案
在启动过程中,您的LANG
可能是C
,但之后(例如在 中zsh
)情况会有所不同(例如en_US.UTF-8
)。 的行为echo
取决于它。检查Arch 文档,很可能您没有设置系统区域设置/etc/locale.conf
,也没有在 中设置用户区域设置~/.config/locale.conf
;但某些程序会在启动后添加它。请明确将所需的区域设置添加到 中~/.config/locale.conf
。这应该会使一切正常。
以下是针对一般情况的解释和一些想法。
通用解决方案
这是因为在问题echo
运行的那一刻,您的语言环境设置不支持 Unicode。
在可以工作的 shell 中echo -e '\uf073'
,比较以下两个:
echo -e '\uf073' # should work
LANG=C echo -e '\uf073' # expect \uF073
最不激进的修复方法是使用任何支持 Unicode 的语言环境运行。像这样echo
:.bspwmrc
LANG=C.UTF-8 echo -e '\uf073' > ~/log.txt
更激进的方法是,在脚本中更早地声明(和导出)LANG
(可能还有变量),以影响之后的所有内容。我没有使用任何与 相关的软件,因此我无法告诉您总体影响是什么。一个好主意可能是仅为子 shell 设置变量:LC_*
.bspwmrc
some_command # this will not be affected
( export LANG=C.UTF-8
echo …
echo …
whatever # all this will be affected
)
other_command # this will not be affected
# And the shell sourcing .bspwmrc (if this is what happens) will not be affected.
笔记:
- 使用 检查您当前的区域设置
locale
。.bspwmrc
您可能希望使用您通常使用的那个。 - 要列出系统中安装的所有语言环境,请调用
locale -a
。 通常,shell 有自己的
echo
内置命令,也有独立的echo
可执行文件(例如/bin/echo
)。每个echo
shell 可能支持也可能不支持。根据大写的\u
事实,我得出结论,读取您的调用的解释器理解语言环境是唯一的问题。如果不是这种情况,以下是一些可能的解决方法:f
.bspwmrc
echo
\u
echo
明确调用内建支持的 shell\u
:bash -c 'LANG=C.UTF-8 echo -e "\uf073"'
使用:
printf
\u
LANG=C.UTF-8 printf '\uf073\n'
注意
printf
可能是也可能不是内置的。就像echo
它可能或不得支持\u
。printf
不使用\u
:printf '\xef\x81\xb3\n'
此字节序列取自
echo -e '\uf073' | xxd
我的 Kubuntu 中显示的内容。仍然printf
可能或不得支持\x
。请注意,此方法不依赖于语言环境。
如果你仅限于使用 POSIX shell 和 POSIX 工具(我的意思是只有 POSIX,没有扩展),则打印 Unicode 字符可能并不容易。