shell 输出编码不正确

shell 输出编码不正确

我不是 Linux 方面的专家,但我正在关注在 Linux Buildroot 上运行的软件的开发。设备只能使用图形界面的程序、访问shell、或者通过串口线或SSH连接。设备的最终用户可以选择连接到其 Wi-Fi 网络。

该程序是用 C++ 编写的,为了执行扫描并获取可用 Wi-Fi 网络的列表,需要执行 shell 命令。

我的问题在于该操作结果的编码;我无法正确显示重音字符。

在程序中,我可以输入带重音的单词并将其显示在屏幕上,没有任何问题。但是,当我从 shell 命令检索结果以获取 Wi-Fi 网络时,我得到一个“不正确”的 ESSID,因为如果网络名称包含字符è,我会看到它的编码为\xC3\xA8,因此,它是无法连接到网络。

我尝试使用一种方法对命令的输出进行编码,但它不起作用。我还直接在 shell 中运行了我在代码中执行的命令,结果编码不正确,如上面示例中所述。我推断这是一个系统问题,我尝试手动设置系统编码,但它没有改变任何东西。

我注意到我正在使用的系统中缺少一些文件。这个问题有解决办法吗??

答案1

这对十六进制代码0xC3 0xA8代表èUTF-8编码。我怀疑你正在使用ISO-8859-1您的程序中的编码(或类似的变体,例如 ISO-8859-15),您希望在其中看到0xA8相同的字符。

您需要调整您的程序以处理 UTF8 字符,或者告诉您的基于 Linux 的系统使用 ISO8850-1 编码而不是 UTF8。

在基于 Linux 的系统上运行此命令以查看其配置为默认使用的编码,

locale

在我的系统上,此报告表明我正在使用英国 (GB) 英语风格的 UTF-8,

LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"

对于我的特定帐户,我可以确定我也在使用此区域设置env | grep -E 'LC_|LANG',它会产生以下输出,

LANGUAGE=en_GB:en
LANG=en_GB.UTF-8

在基于 Debian 的系统上,您应该能够使用dpkg-reconfigure locales.此命令还允许您定义可用的其他区域设置。

相关内容