tail -f
ファイルが必要ですが、その内容はエンコードさsjis
れているため、端末のデフォルト(utf-8)エンコードに変換する必要があります。
私がするとき
tail-FX |
出力がありません。 〜のように
tailx |
動作します。最初はバッファリングの問題だと思いましたが、上記のようにunbuffer
試しました。stdbuf
パイプラインでバッファリングをオフにする役に立ちません。
実際、10,000を超えるデータを追加してもEOFが受信されました。
それでは、sjisでエンコードされたファイルをどのように追跡できますか?
答え1
(これを少し塩で受け入れてください。)私が知っている限り、問題はlibiconv
それがどのように機能するかです。マルチバイトエンコーディングはそれをデコードするためにステートマシンを必要とし、文字全体のlibiconv
受信を好むので、ある関数呼び出しに文字半分を提供し、次の関数呼び出しに残りの半分を提供することはできません。
私は良い帯域外アプローチと帯域内ハッキングという2つの異なるソリューションを考えることができます。
ターミナルエミュレータエンコーディングの変更(帯域外):1つは、デフォルトのエンコーディングがShift JISになるようにターミナルエミュレータの文字エンコーディングを変更することです。今確認してみると、konsole
この機能がサポートされます。メニューから表示→文字エンコード→日本語→sjisを選択します。その後、tail -f
ファイルを処理してkonsole
マルチバイト文字をデコードして、フォント文字と一致する操作を処理できます。
動的トランスコーディングエンドポイントエンコーディング(帯域内、最適)luit
:久しぶりに思い出されるザイルズ様の文です。を使用するluit
には、XOrgディストリビューションと一緒に提供する必要があります(Debianではpackageですx11-utils
)。次のように使用してください。
$ luit -encoding SJIS -- tail -f x
これにより、端末はSJISを端末エンコードに変換しますtail -f x
。欠点は、luit
サポートされている豊富なエンコーディングをサポートしていないことですlibiconv
。利点は、ほぼどこでも使用できることです。
動的トランスコーディング端末エンコーディング(帯域内、ハッカー):ttyconv
数年前に書いたハッキング文です。(もともとCで、後でPythonに書き直す)libiconv
ターミナルI / Oをトランスコードするためのものです。新しい擬似端末を作成し、(a)入力した文字をローカルエンコーディングからリモートエンコーディングにトランスコードし、(b)リモートエンコーディングから受信した文字をローカルエンコーディングにトランスコードします。標準のLinux端末でサポートされていないエンコーディングを使用してサーバーと通信するために使用されます。私がテストしたすべてのリモートエンコーディングはシングルバイトエンコーディングなので、Shift JISで動作することを保証することはできません。最近では、ほとんどのシステムがUnicodeに移行しているため、それを使用する携帯電話は頻繁に見つかりません。
次のように使用できます。
$ ttyconv -rsjis -- tail -f x
欠点ttyconv
は私が書いたこと、私以外は誰も使わず、おそらくバグがいっぱいになるという点だ。私はこれがうまくいきます。良い点は、を使用することですlibiconv
。したがって、コーディングが珍しい場合、これが最善の選択です。最後に、ttyconv --list
100個のエンコーディングがサポートされました。
答え2
Rich FelkerがCで書いたのとttyconv
似ています。tconv