我正在尝试将 unicode 文字转换为可读格式。我使用 -t 标志来查看 xargs 在运行之前将运行什么命令。我看到以下奇怪之处:
$ echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
echo -e "\t\u0042\u0065\u006e"
" \u0042\u0065\u006e"
然而,当我手动运行它时:
$ echo -e "\t\u0042\u0065\u006e"
Ben
$
\t
在这两个示例中都得到了正确的处理。但\u00XX
在第一个示例中,这些值被视为纯字符串,但在第二个示例中被正确编码。当我使用时,我printf
也看到同样的奇怪现象。
$echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' printf \"{}\"
printf "\t\u0042\u0065\u006e"
" printf: invalid universal character name \u0042
$ printf "\t\u0042\u0065\u006e"
Ben
关于发生的事情以及如何解决它有什么想法吗?
答案1
Dave 是正确的,不涉及 shell,所以 echo 是 /bin/echo,试试这个:
echo "\\\t\\\u0042\\\u0065\\\u006e" | od -c
echo "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
# echo -e '"'\t\u0042\u0065\u006e'"'
/bin/echo -e '"'\\t\\u0042\\u0065\\u006e'"'
结果:
0000000 \ \ t \ \ u 0 0 4 2 \ \ u 0 0 6
0000020 5 \ \ u 0 0 6 e \n
0000031
" \u0042\u0065\u006e"
" \u0042\u0065\u006e"
echo -e "\t\u0042\u0065\u006e"