“tail -f | iconv -fsjis”不輸出任何內容
我想要
tail -f
一個文件,但它的內容是sjis
編碼的,所以我需要將它轉換為我的終端的本機 (utf-8) 編碼。當我做
尾-fx | iconv -fsjis
不會有輸出。作為
尾x | iconv -fsjis
確實有效,起初我認為這是一個緩衝問題,但嘗試
unbuffer
並stdbuf
如關閉管道中的緩衝所述並沒有幫助。其實x加了10k多的數據後,還是沒有輸出,所以我猜不是緩衝的問題(緩衝是4k,如果我沒記錯的話),但是iconv只有在什麼時候才開始輸出它收到一個EOF。
那麼我怎樣才能跟踪我的 sjis 編碼文件呢?
(用一小撮鹽拿走這個)據我所知,問題在於工作方式
libiconv
。多字節編碼需要一個狀態機來解碼它們,並且libiconv
更喜歡接收整個字元,所以你不能在一個函式呼叫中只給它半個字元,而在下一個函式呼叫中給它另一半。我可以想到另外兩種解決方案,一種是很好的帶外方法,另一種是帶內破解。
更改終端仿真器編碼(帶外):一種是更改終端仿真器中的字元編碼,因此其本機編碼為 Shift JIS。我剛查了一下
konsole
,是支持這個的。從菜單中,查看→字元編碼→日語→sjis。然後,您可以只tail -f
處理文件,並konsole
負責解碼多字節字元並將它們與字型字形匹配。即時轉碼終端編碼(帶內;最佳)
luit
:由 Gilles 提供,他在很長一段時間後讓我想起了。使用luit
,它應該隨您的 XOrg 發行版一起提供(在 Debian 上,它是 packagex11-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 種編碼。