GNU/Linux >> Belajar Linux >  >> Linux

“ekor -f | Iconv -fsjis” Tidak Mengeluarkan Apa Pun?

Saya ingin tail -f sebuah file, tetapi isinya dalam sjis penyandian, jadi saya harus mengubahnya ke penyandian asli (utf-8) terminal saya.

Ketika saya melakukannya

ekor -f x | iconv -fsjis

tidak akan ada keluaran. Sebagai

ekor x | iconv -fsjis

berhasil, awalnya saya pikir itu adalah masalah buffering, tetapi mencoba unbuffer dan stdbuf seperti yang dijelaskan pada Matikan buffering di pipa tidak membantu.

Faktanya, bahkan setelah lebih dari 10k data ditambahkan ke x, tidak akan ada output, jadi saya kira itu bukan masalah buffering (buffer adalah 4k, jika saya tidak salah), tetapi iconv hanya akan mulai mengeluarkan ketika ia menerima EOF.

Jadi bagaimana saya bisa mengikuti file yang disandikan sjis saya?

Jawaban yang Diterima:

(ambil ini dengan sedikit garam) Sejauh yang saya ingat, masalahnya terletak pada cara libiconv bekerja. Pengkodean multi-byte memerlukan mesin status untuk memecahkan kodenya, dan libiconv lebih suka menerima seluruh karakter, jadi Anda tidak bisa hanya memberikan setengah karakter dalam satu panggilan fungsi dan setengah lainnya di panggilan berikutnya.

Saya dapat memikirkan dua solusi lain, satu adalah metode out-of-band yang baik, yang lain adalah hack in-band.

Ubah pengkodean Terminal Emulator (out-of-band) :salah satunya adalah mengubah pengkodean karakter di emulator terminal Anda, jadi penyandian aslinya adalah Shift JIS. Saya baru saja memeriksa konsole , dan mendukung ini. Dari menu, Lihat→Pengkodean karakter→Jepang→sjis. Anda kemudian dapat tail -f file, dan konsole akan menangani decoding karakter multibyte dan mencocokkannya dengan font glyphs.

Enkode terminal transkode dengan cepat (dalam-band; terbaik) :milik Gilles, yang mengingatkan saya pada luit setelah waktu yang sangat lama. Gunakan luit , yang seharusnya disertakan dengan distribusi XOrg Anda (di Debian, paketnya x11-utils ). Gunakan seperti ini:

$ luit -encoding SJIS -- tail -f x

Ini akan membuat terminal mentranskode SJIS ke/dari pengkodean terminal Anda, dan menjalankan tail -f x . Kelemahan luit adalah bahwa itu tidak mendukung banyak pengkodean yang didukung oleh libiconv . Keuntungannya adalah tersedia hampir di mana-mana.

Enkode terminal transkode dengan cepat (dalam-band; retas) :ttyconv adalah retasan yang saya tulis bertahun-tahun yang lalu (awalnya dalam C, kemudian dibuat ulang dengan Python) yang menggunakan libiconv untuk mentranskode terminal I/O. Ini memunculkan terminal semu baru dan (a) mentranskode karakter yang Anda ketik dari pengkodean lokal Anda ke pengkodean jarak jauh, dan (b) mentranskode karakter yang Anda terima dari pengkodean jarak jauh ke pengkodean lokal Anda. Saya menggunakannya untuk berbicara dengan server yang menggunakan penyandian yang tidak didukung oleh terminal Linux standar. Harap dicatat bahwa semua pengkodean jarak jauh yang saya uji adalah pengkodean byte tunggal, jadi saya tidak dapat menjamin itu akan berfungsi untuk Shift JIS. Saya tidak sering menemukan panggilan untuk menggunakannya akhir-akhir ini, dengan sebagian besar sistem beralih ke Unicode.

Terkait:Listrik – Sensor dengan output digital TTL?

Beginilah cara Anda menggunakannya:

$ ttyconv -rsjis -- tail -f x

Kelemahan dari ttyconv adalah saya yang menulisnya, tidak ada yang menggunakannya selain saya, mungkin penuh dengan bug. Saya unggul dalam hal ini. Keuntungannya adalah ia menggunakan libiconv , jadi jika penyandian Anda tidak biasa, itu adalah pilihan terbaik Anda. Pada hitungan terakhir, ttyconv --list mendukung 100 penyandian.


Linux
  1. Bagaimana Suatu Program Memutuskan Apakah Memiliki Output Berwarna atau Tidak?

  2. Vsftpd Tidak Mencantumkan Konten Direktori?

  3. Mengapa dentang menghasilkan teks yang tidak dapat dipahami saat dialihkan?

  1. Terminal Prompt Tidak Membungkus dengan Benar?

  2. Terminal Ctrl+s Versus Ctrl+z?

  3. Apa arti sebenarnya perangkat input bukan TTY dalam keluaran docker run?

  1. Mengapa "sementara Baca" Ini Bekerja Di Terminal, Tapi Tidak Di Skrip Shell?

  2. Mengapa `keluar &` Tidak Berfungsi?

  3. gnome-terminal:perintah tidak ditemukan