Tail

“tail -f | iconv -fsjis”不輸出任何內容

  • May 11, 2016

我想要tail -f一個文件,但它的內容是sjis編碼的,所以我需要將它轉換為我的終端的本機 (utf-8) 編碼。

當我做

尾-fx | iconv -fsjis

不會有輸出。作為

尾x | iconv -fsjis

確實有效,起初我認為這是一個緩衝問題,但嘗試unbufferstdbuf關閉管道中的緩衝所述並沒有幫助。

其實x加了10k多的數據後,還是沒有輸出,所以我猜不是緩衝的問題(緩衝是4k,如果我沒記錯的話),但是iconv只有在什麼時候才開始輸出它收到一個EOF。

那麼我怎樣才能跟踪我的 sjis 編碼文件呢?

(用一小撮鹽拿走這個)據我所知,問題在於工作方式libiconv。多字節編碼需要一個狀態機來解碼它們,並且libiconv更喜歡接收整個字元,所以你不能在一個函式呼叫中只給它半個字元,而在下一個函式呼叫中給它另一半。

我可以想到另外兩種解決方案,一種是很好的帶外方法,另一種是帶內破解。

更改終端仿真器編碼(帶外):一種是更改終端仿真器中的字元編碼,因此其本機編碼為 Shift JIS。我剛查了一下konsole,是支持這個的。從菜單中,查看→字元編碼→日語→sjis。然後,您可以只tail -f處理文件,並konsole負責解碼多字節字元並將它們與字型字形匹配。

即時轉碼終端編碼(帶內;最佳)luit :由 Gilles 提供,他在很長一段時間後讓我想起了。使用luit,它應該隨您的 XOrg 發行版一起提供(在 Debian 上,它是 package x11-utils)。像這樣使用它:

$ luit -encoding SJIS -- tail -f x

這將使終端將 SJIS 轉碼到您的終端編碼/從您的終端編碼轉碼,然後執行tail -f x. 缺點luit是它不支持libiconv. 好處是它幾乎無處不在。

Transcode terminal encoding on the fly (in-band; hack)ttyconv是我多年前寫的一個 hack(最初用 C 語言,後來用 Python 重做),用於libiconv對終端 I/O 進行轉碼。它生成一個新的偽終端,並且 (a) 將您鍵入的字元從本地編碼轉碼為遠端編碼,以及 (b) 將您從遠端編碼接收的字元轉碼為本地編碼。我用它與使用標準 Linux 終端不支持的編碼的伺服器通信。請注意,我測試過的所有遠端編碼都是單字節編碼,所以我不能保證它適用於 Shift JIS。這些天我不經常找到使用它的電話,大多數係統都切換到 Unicode。

這是你將如何使用它:

$ ttyconv -rsjis -- tail -f x

缺點ttyconv是我寫的,除了我沒有人使用它,它可能充滿了錯誤。我擅長這一點。好處是它使用libiconv.,所以如果你的編碼不尋常,這是你最好的選擇。最後計數,ttyconv --list支持 100 種編碼。

引用自:https://unix.stackexchange.com/questions/35662