(塩を少し入れて)覚えている限り、問題はlibiconv
動作の仕方にあります。マルチバイトエンコーディングは、それらをデコードするためのステートマシンを必要とし、libiconv
文字全体を受け取ることを好むため、ある関数呼び出しで半分の文字を与え、次の関数呼び出しで残りの半分を与えることはできません。
別の2つの解決策を考えることができます。1つは優れた帯域外の方法で、もう1つは帯域内のハックです。
ターミナルエミュレータエンコーディングの変更(帯域外):ターミナルエミュレータの文字エンコーディングを変更するため、ネイティブエンコーディングはShift JISです。私はちょうどチェックしkonsole
、これをサポートしています。メニューから、[表示]→[文字エンコード]→[日本語]→[sjis]。その後tail -f
、ファイルだけを作成しkonsole
、マルチバイト文字をデコードし、フォントグリフに一致させることができます。
オンザフライでの端末エンコードのトランスコード(帯域内、最高):luit
非常に長い時間を経て私に思い出させたGillesの好意による。luit
XOrgディストリビューションに付属しているはずのを使用します(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 --list
100個のエンコードをサポートします。