"tail -f | iconv -fsjis"は何も出力しません。

"tail -f | iconv -fsjis"は何も出力しません。

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 --list100個のエンコーディングがサポートされました。

答え2

Rich FelkerがCで書いたのとttyconv似ています。tconv

望むより:Re:aterm/rxvt/etcを編集するには電話してください...

関連情報