“Kuyruk -f | iconv -fsjis ”herhangi bir çıktı vermez


14

Ben tail -fbir dosyaya istiyorum , ama içeriği sjiskodlama, bu yüzden benim terminal yerel (utf-8) kodlaması dönüştürülmüş olması gerekir.

Ben yaparken

kuyruk -fx | iconv -fsjis

çıktı olmayacak. Gibi

kuyruk x | iconv -fsjis

işe yarıyor, ilk başta bir tamponlama sorunu olduğunu düşündüm, ama denerken unbufferve stdbufaçıklandığı gibi Boruda tamponlamayı kapat yardımcı olmadı.

Aslında, x'e 10k'dan fazla veri eklendikten sonra bile, çıktı olmayacaktı, bu yüzden bir tamponlama sorunu olmadığını düşünüyorum (arabellek 4k, yanılmıyorsam), ancak iconv yalnızca bir EOF alır.

Peki sjis kodlu dosyamı nasıl takip edebilirim?

Yanıtlar:


11

(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.


Harika, teşekkürler. bant dışı benim için işe yaramadı (gnome terminali, kodlamayı değiştirmenize izin vermesine rağmen), ancak ttyconv bir cazibe gibi çalışıyor.
Eugene Beresovsky

2
Bugünlerde, luitstandart X11 yardımcı program paketinin bir parçası var ttyconv.
Gilles 'SO- kötü olmayı bırak'

@Gilles luitbenzer, ancak benimkinden çok daha iyi çalışıyor. ;) Teşekkürler! Bu yüzden ilk etapta kullanmayı bıraktım. O zamandan beri 12 yıl içinde komut adını bile unutmayı başardım ve o zamandan beri aradım.
Alexios

@Gilles luitbenim için de işe yarıyor. Neden 'resmi' bir cevap vermiyorsun? Kurulumumun bir parçasıydı (debian) ve bu yüzden benim için kullanımı en kolay olanıydı.
Eugene Beresovsky

1
Cevabı luitSJIS için en iyi seçim olarak dahil etmek üzere güncelledim . Ne yazık ki, her kodlamanın desteklemediği anlaşılıyor libiconv. Görünüşe göre hala kendi çözümümü kendi gerçeküstü amaçlarım için kullanmak zorundayım. :)
Alexios

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.