(bunu bir tutam tuzla alın) Hatırladığım kadarıyla, sorun libiconvişte yatıyor . Çok baytlı kodlamalar, kodları çözmek için bir durum makinesine ihtiyaç duyar ve libiconvtüm karakterleri almayı tercih eder, bu nedenle bir işlev çağrısında yarım karakter, diğerinde ise diğer yarıyı veremezsiniz.
Bir başka iki çözüm düşünebilirim, biri iyi bir bant dışı yöntem, diğeri bant içi bir kesmek.
Terminal Emulator kodlamasını değiştirme (bant dışı) : biri terminal öykünücünüzdeki karakter kodlamasını değiştirmek, böylece yerel kodlaması Shift JIS'dir. Sadece kontrol ettim konsoleve bunu destekliyor. Menüden Görünüm → Karakter kodlama → Japonca → sjis. Daha sonra sadece tail -fdosyayı oluşturabilir ve konsoleçok baytlı karakterlerin kodunu çözüp font glifleriyle eşleştirebilirsiniz.
Anında kod kodlama terminali (bant içi; en iyi) : luitçok uzun bir süre sonra bana hatırlatan Gilles'in izniyle . luitXOrg dağıtımınızla birlikte gelmesi gereken kullanımı (Debian'da, paketidir x11-utils). Şöyle kullanın:
$ luit -encoding SJIS -- tail -f x
Bu, SJIS terminal kodunu terminal kodlamanıza / kodlamanız yapar ve çalışır tail -f x. Bunun dezavantajı, luitdesteklediği kodlama zenginliğini desteklememesidir libiconv. Ters tarafı hemen hemen her yerde kullanılabilir.
Transcode terminal kodlama anında (bant içi; hack) : ttyconvyıllar önce yazdığım bir hack'tir (başlangıçta C, daha sonra Python'da redone) libiconvterminal G / Ç'yi kodlamak için kullanılır . Yeni bir sözde örnek oluşturur ve (a) yerel kodlamanızdan yazdığınız karakterleri uzaktan kodlamaya kodlar ve (b) uzak kodlamadan aldığınız karakterleri yerel kodlamanıza kodlar. Standart Linux terminalleri tarafından desteklenmeyen kodlamaları kullanan sunucularla konuşmak için kullandım. Test ettiğim tüm uzak kodlamaların tek baytlı kodlamalar olduğunu lütfen unutmayın, bu yüzden Shift JIS için çalışacağını garanti edemem. Çoğu sistem Unicode'a geçerek, bugünlerde kullanmak için çağrı bulamıyorum.
Bunu nasıl kullanacağınız:
$ ttyconv -rsjis -- tail -f x
Olumsuz tarafı ttyconvyazdım, kimse kullanmıyor ama ben, muhtemelen hatalarla dolu. Ben bu konuda mükemmelim. Tersi, kullanmasıdır libiconv, bu nedenle kodlamanız olağandışıysa, en iyi bahistir. Son olarak, ttyconv --list100 kodlamayı destekler.