![如何从十六进制变量获取UTF8?](https://linux22.com/image/110225/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E5%8F%98%E9%87%8F%E8%8E%B7%E5%8F%96UTF8%EF%BC%9F.png)
我正在为客户调试一个应用程序,我从数据库中找到了可以解决问题的信息。我要求客户提取它,但不幸的是客户向我发送了十六进制的原始数据......
我要求客户重新向我发送来自数据库工具的纯文本,但在等待他们的回复时我正在寻找 bash 解决方案。
我知道编码数据是UTF-8编码的字符串:有没有办法用Unix工具对其进行解码?
答案1
与xxd
(通常与 一起发货vim
)
$ echo 5374c3a97068616e650a | xxd -p -r
Stéphane
如果您的语言环境的字符集(请参阅 的输出locale charmap
)不是 UTF-8(但可以表示编码字符串中的所有字符),请添加| iconv -f UTF-8
.
如果它不能代表所有字符,您可以尝试 | iconv -f UTF-8 -t //TRANSLIT
获得近似值。
答案2
Perl 算吗?
$ echo "68656c6c6f0a" | \
perl -ne 'tr/a-fA-F0-9//cd; print pack("H*", $_)'
hello
如果没有,那么也许可以这样做:
$ echo "68656c6c6f0a" | sed -Ee 's/[0-9a-fA-F]{2}/\\\\x&/g' | xargs printf
hello
我们需要一个字面上的反斜杠printf
,但它对于两者来说都是特殊的xargs
,因此sed
需要加倍两次。 ( \\\\x
-> \\x
-> \x
)