4

我有一个列表,其中包含符号和 unicode 数字的混合(长度均为 4),其中一些是基本拉丁语的一部分。我想将它们全部打印为符号。

我尝试使用 Bash(在 Cygwin 下)失败的示例:

list="0 3 4 5 005e 0060 00ff"
$ for c in $list; do [[ ${#c} = 4 ]] && env printf "\\u$c\n" || 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 码点

4

1 回答 1

3

此修复将允许您使用任何编码中的任何字符:

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
于 2012-10-02T18:31:45.520 回答