Bash 将 \xC3\x89 转换为 É?

Bash 将 \xC3\x89 转换为 É?

我正在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

hdhexdump 实用程序在哪里。

所以你的事情只是UTF-8编码(您观察到的输出\xC3\x89是 UTF-8 的十六进制表示)。今天我们有UTF-8 无处不在

我的环境同时具有LANG=en_US.UTF-8LC_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 非控制字符的字节,其中\xHHHH十六进制字节数。

要撤消该编码,您可以将输出传送iwlist

perl -pe 's/\\x([\da-f]{2})/chr(hex($1))/gie'

0xc3后面的字节0xa9组成了字符的 UTF-8 编码é

如果您的区域设置也使用 UTF-8 编码,则 的输出perl将显示该é字符。如果不是(不太可能,因为 UTF-8 是标准),您始终可以通过管道传递 to 的输出,perliconv -f utf-8其从 UTF-8 转换f为您的语言环境中使用的字符编码。

相关内容