我可以将带有扩展代码的文本复制并粘贴到 xterm(实际上是 xfce4-terminal)中,它们显示得很好。将扩展字符通过管道传输到十六进制编辑器可以很好地显示它们,例如:十六进制中的“Stéphane”显示为:“53 74 c3 a9 70 68 61 6e 65 0a”——带重音的“e”是十六进制:c3,一切都很好。但我不知道如何在 xterm 中编写扩展代码。我已经尝试了以下所有变体:“ echo $'\xc3' ”,但没有任何效果。
答案1
获得é
进入echo -e "\xC3\xA9"
.
假设您的 xterm 设置为 UTF-8 编码,那么您可以查找要打印的字符的 UTF-8 十六进制编码https://www.utf8-chartable.de/。
答案2
两个字节的序列 0xc3 0xa9 是预组合的 UTF-8 编码é
,e
带有锐音符 U+00E9 字符。
如果您的终端模拟器配置为使用该字符集,因为它是在locale charmap
返回的环境中运行UTF-8
(例如在fr_FR.UTF-8
语言环境中),那么您将得到这样的结果。
在配置为使用 ISO8859-1 或 ISO8859-15 字符集(如区域设置)的终端中fr_FR.iso885915@euro
,您将获得 0xe9 字节。在zh_HK.big5hkscs
语言环境中,您将得到 0x88 0x6d 等等。
在zsh
:
print '\ue9'
printf '\ue9\n'
echo '\ue9'
将打印在区域设置的字符映射中编码的 U+00E9 字符(后者仅在bsdecho
未启用该选项的情况下,在这种情况下您需要使用-e
; 通常echo
是一个不可移植的命令,最好避免)。
您还可以要求这些内置函数打印与这个或那个字符集中该字符的编码相对应的字节,而不是根据其 Unicode 代码点输出字符。
任何一个:
print -r -- 'é'
printf '%s\n' 'é'
echo -E - 'é'
我们将字节逐字(作为终端的输入)传递给它们,并\
使用相应的-r
/-E
选项禁用扩展,或者为它们提供八进制或十六进制的字节值以供它们扩展。例如,对于该é
字符的 UTF-8 编码:
print '\xc3\xa9' # hex
print '\303\251' # octal
printf '\xc3\xa9\n' # hex
printf '\303\251\n' # octal (POSIX)
echo '\xc3\xa9' # hex
echo '\0303\0251' # note the extra 0s
printf '%b\n' '\0303\0251' # printf's %b recognises the same escapes
# as echo. Was introduced by POSIX to help
# people transition away from echo AFAIK.
或者您可以使用$'...'
引号的形式,其中 shell 支持相同的转义序列(正常的转义序列,而不是转义echo
序列),并且在传递给实用程序之前进行扩展:
print -r -- $'\ue9' # expanded to eacute character in the locale's charmap
print -r -- $'\xc3\xa9' # passing the UTF-8 encoding of eacute
print -r -- $'\xe9' # passing the ISO8859-1 encoding of eacute
$'...'
(最初来自 ksh93)将包含在该sh
语言的 POSIX 规范的下一版本中,但不会包含该$'\uxxxx'
部分(最初来自 zsh),因为支持它的实现之间对于使用哪个 Charmap 来扩展它以及扩展什么内容没有达成共识如果该字符映射中不存在相应的字符,则执行此操作。对于 zsh,这是运行命令时有效的区域设置的字符映射,如果该字符不存在,则这是一个致命错误。
¹ 不要与分解版本混淆é
,由两个字符组成:e
(U+0065) 在所有字符集中编码为 0x65,这些字符集是 ASCII 的超集,包括 UTF-8,后跟结合尖锐的口音字符,U+0301,在 UTF-8 中编码为 0xcc 0x81。