シェル出力エンコーディングが正しくありません。

シェル出力エンコーディングが正しくありません。

私はLinuxの専門家ではありませんが、Linux Buildrootで実行されるソフトウェア開発に従います。デバイスは、グラフィカルインタフェースプログラムを使用したり、シェルにアクセスしたり、シリアルケーブルまたはSSHを介してのみ接続できます。デバイスのエンドユーザーは、Wi-Fiネットワークに接続することを選択できます。

このプログラムはC ++で書かれており、スキャンを実行して利用可能なWi-Fiネットワークのリストを取得するには、シェルコマンドを実行する必要があります。

私の問題は、このタスクの結果のエンコードにあります。アクセント付きの文字を正しく表示できません。

プログラム内でアクセント付きの単語を入力し、問題なく画面に表示することができます。ただし、Wi-Fiネットワークを取得するためにシェルコマンドから結果を取得すると、「無効な」ESSIDが得られます。ネットワーク名に文字が含まれていると、文字がèエンコードされて\xC3\xA8接続できないためです。ネットワーク。

私はコマンド出力をエンコードする方法を試しましたが、うまくいきません。また、コードで実行したコマンドをシェルから直接実行しましたが、結果は上記の例のように誤ってエンコードされました。私はこれがシステムの問題だと推測し、システムエンコーディングを手動で設定してみましたが、何も変わりませんでした。

私が使用しているシステムにいくつかのファイルがありませんでした。この問題に対する解決策はありますか? ?

答え1

この16進コードペア0xC3 0xA8èUTF-8コーディング。私はあなたが使用していると思うISO-8859-10xA8同じ文字が表示されると予想されるプログラム(またはISO-8859-15などの同様の変形)のエンコード。

UTF8文字を処理するようにプログラムを調整するか、LinuxベースのシステムにUTF8の代わりにISO8850-1エンコーディングを使用するように指示する必要があります。

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。このコマンドを使用すると、使用可能な追加のロケールを定義することもできます。

関連情報