(塩を少し入れて)覚えている限り、問題は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個のエンコードをサポートします。