我正在iwlist wlo1 scan | grep ESSID
脚本内运行。
它按以下格式显示法语字符
\xC3\x89
为 É 和\xC3\xA9
é。
我不确定这种格式叫什么。我尝试使用转换unicode的答案 echo -ne '\xC3\xA9' | iconv -f utf-16be
但它转换为쎩
.
这种格式的正式名称是什么?如何在 bash 中转换它?
答案1
十六进制数字常量通常用0x
前缀表示。
字符和字符串常量可以用十六进制表示字符代码,前缀\x
后跟两个十六进制数字。
echo -ne '\xC3\x89'
应该给你É
。
-e
- 启用反斜杠转义的解释(包括\xHH
- 具有十六进制值的字节HH
(1 到 2 位数字))
处理更好的便携性使用printf
功能:
printf "%b" '\xC3\x89'
É
答案2
尝试
% echo -n éÉ | hd
00000000 c3 a9 c3 89 |....|
00000004
hd
hexdump 实用程序在哪里。
所以你的事情只是UTF-8编码(您观察到的输出\xC3\x89
是 UTF-8 的十六进制表示)。今天我们有UTF-8 无处不在。
我的环境同时具有LANG=en_US.UTF-8
和LC_ALL=en_US.UTF-8
(即使我是法国人)。
还,
echo '\xC3\x89\xC3\xA9'
产生
Éé
正如预期的那样。
也是如此
echo "\\xC3\\x89\\xC3\\xA9" | iconv -t utf-8
另请阅读语言环境(7)。
请注意,一些字符编码(例如旧平原ASCII码)没有任何é
或É
字符,以及其他字符(例如ISO-8859-1)对它们进行不同的编码。
答案3
iwlist
显示所有不对应于 ASCII 非控制字符的字节,其中\xHH
是HH
十六进制字节数。
要撤消该编码,您可以将输出传送iwlist
到
perl -pe 's/\\x([\da-f]{2})/chr(hex($1))/gie'
0xc3
后面的字节0xa9
组成了字符的 UTF-8 编码é
。
如果您的区域设置也使用 UTF-8 编码,则 的输出perl
将显示该é
字符。如果不是(不太可能,因为 UTF-8 是标准),您始终可以通过管道传递 to 的输出,perl
将iconv -f utf-8
其从 UTF-8 转换f
为您的语言环境中使用的字符编码。