「tail -f | iconv -fsjis」は何も出力しません


14

tail -fファイルにしたいのですが、そのコンテンツはsjisエンコードされているため、端末のネイティブ(utf-8)エンコードに変換する必要があります。

私がする時

テール-fx | iconv -fsjis

出力はありません。なので

テールx | iconv -fsjis

作業は、最初に私にそれがバッファリングの問題だと思ったが、しようとしないunbufferstdbufに記載されているように、パイプにバッファリングをオフにすることは助けにはなりませんでした。

実際、10kを超えるデータがxに追加された後でも、出力はないため、バッファリングの問題ではないと思います(間違っていない場合、バッファは4kです)が、iconvはEOFを受け取ります。

sjisでエンコードされたファイルをどのようにテールフォローできますか?

回答:


11

(塩を少し入れて)覚えている限り、問題はlibiconv動作の仕方にあります。マルチバイトエンコーディングは、それらをデコードするためのステートマシンを必要とし、libiconv文字全体を受け取ることを好むため、ある関数呼び出しで半分の文字を与え、次の関数呼び出しで残りの半分を与えることはできません。

別の2つの解決策を考えることができます。1つは優れた帯域外の方法で、もう1つは帯域内のハックです。

ターミナルエミュレータエンコーディングの変更(帯域外):ターミナルエミュレータの文字エンコーディングを変更するため、ネイティブエンコーディングはShift JISです。私はちょうどチェックしkonsole、これをサポートしています。メニューから、[表示]→[文字エンコード]→[日本語]→[sjis]。その後tail -f、ファイルだけを作成しkonsole、マルチバイト文字をデコードし、フォントグリフに一致させることができます。

オンザフライでの端末エンコードのトランスコード(帯域内、最高)luit非常に長い時間を経て私に思い出させたGillesの好意による。luitXOrgディストリビューションに付属しているはずのを使用します(Debianでは、パッケージです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個のエンコードをサポートします。


素晴らしいです、ありがとう。アウトオブバンドは機能しませんでした(gnome-terminal、エンコードを変更することはできますが)が、ttyconvは魅力のように機能します。
ユージンベレソフスキー

2
最近でluitは、標準のX11ユーティリティスイートの一部があり、これはに似ていますttyconv
ジル 'SO-悪であるのをやめる

@Gilles luitも似ていますが、それは私のものよりもはるかに優れています。;)ありがとう!そもそも私が使用をやめた理由です。コマンド名さえ忘れてから12年で、それ以来ずっと探していました。
Alexios

@Gilles luitは私にも役立ちます。なぜそれを「公式」の答えにしないのですか?これは私のインストール(debian)の一部であったため、私にとって最も使いやすいものです。
ユージンベレソフスキー

1
回答を更新して、luitSJISの最適な選択肢として含めました。悲しいことに、すべてのエンコーディングlibiconvがサポートしているわけではないようです。シュールな目的のために、独自のソリューションを使用する必要があるようです。:)
Alexios

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.