我有一个列表,其中包含符号和Unicode数字(长度均为四),其中一些是基本拉丁语的一部分。我想将它们全部打印为符号。
我尝试使用Bash失败的示例(在Cygwin下):
list="0 3 4 5 005e 0060 00ff"
$ for c in $list; do [[ ${#c} = 4 ]] && env printf "\u$cn" || echo $c; done
0
3
4
5
printf: invalid universal character name u005e
005e
`
ÿ
无论终端中的区域设置和编码如何,我都会遇到同样的问题。
我无法从askununtu工作中获得这个问题的答案:https://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoint
此修复将允许您使用任何编码中的任何字符:
list="0 3 4 5 005e 0060 00ff"
for c in $list; do
if [ ${#c} = 4 ]; then
echo 0 "$c" | xxd -r | iconv -f UNICODEBIG -t UTF-8
echo
else
echo "$c"
fi
done
带有 -r 选项的 xxd 将十六进制文本转换为字节。 它需要行号,这就是回显中的前导 0。 在这种情况下,xxd 输出由 c 指示的两个字节。
xxd 的结果通过管道传输到 iconv。 iconv 将一种编码转换为另一种编码。 UNICODEBIG 是双字节 Unicode 字符,第一个字节最重要。 UTF-8 是要转换为的编码。 (如果不使用 UTF-8,请替换终端的编码)。 这会将字符转换为指定的编码。
此技巧使您可以完全自由地以任何支持它的编码对从 0000 到 ffff 的任何 unicode 字符进行编码。
编辑:找到了使用xxd的更简单的方法。 新方式如上所示,旧方式在这里:
echo -ne \x"${c:0:2}"\x"${c:2:2}" | iconv -f UNICODEBIG -t UTF-8