Đuôi đuôi -f | iconv -fsjis không xuất bất cứ thứ gì


14

Tôi muốn tail -fmột tập tin, nhưng nội dung của nó là sjismã hóa, vì vậy tôi cần phải chuyển đổi nó thành mã hóa gốc (utf-8) của thiết bị đầu cuối của tôi.

Khi tôi làm

đuôi -fx | iconv -fsjis

sẽ không có đầu ra. Như

đuôi x | iconv -fsjis

không hoạt động, lúc đầu tôi nghĩ đó là vấn đề về bộ đệm, nhưng cố gắng unbufferstdbufnhư được mô tả trên Tắt bộ đệm trong đường ống không giúp ích gì.

Trên thực tế, ngay cả sau khi hơn 10k dữ liệu được thêm vào x, sẽ không có đầu ra, vì vậy tôi đoán đó không phải là vấn đề về bộ đệm (bộ đệm là 4k, nếu tôi không nhầm), nhưng iconv sẽ chỉ bắt đầu xuất khi nó nhận được EOF.

Vì vậy, làm thế nào tôi có thể theo dõi tập tin được mã hóa sjis của tôi?

Câu trả lời:


11

(lấy cái này với một nhúm muối) Theo tôi nhớ, vấn đề nằm ở cách libiconvlàm việc. Mã hóa nhiều byte cần một máy trạng thái để giải mã chúng và libiconvthích nhận toàn bộ các ký tự, vì vậy bạn không thể chỉ cung cấp cho nó một nửa ký tự trong một lệnh gọi hàm và nửa còn lại trong lần gọi tiếp theo.

Tôi có thể nghĩ về hai giải pháp khác, một là một phương pháp ngoài băng tốt, hai là một hack trong băng tần.

Thay đổi mã hóa Trình mô phỏng đầu cuối (ngoài băng tần) : một là thay đổi mã hóa ký tự trong trình giả lập thiết bị đầu cuối của bạn, vì vậy mã hóa gốc của nó là Shift JIS. Tôi chỉ kiểm tra konsole, và được hỗ trợ này. Từ menu, Xem → Mã hóa ký tự → Japenese → sjis. Sau đó, bạn có thể chỉ tail -ftập tin và konsolesẽ đảm nhiệm việc giải mã các ký tự đa nhân và kết hợp chúng với các glyphs phông chữ.

Mã hóa thiết bị đầu cuối chuyển đổi nhanh chóng (trong băng tần; tốt nhất) : lịch sự của Gilles, người đã nhắc nhở tôi luitsau một thời gian rất dài. Sử dụng luit, đáng lẽ phải đi kèm với bản phân phối XOrg của bạn (trên Debian, đó là gói x11-utils). Sử dụng nó như thế này:

$ luit -encoding SJIS -- tail -f x

Điều này sẽ làm cho mã hóa đầu cuối SJIS đến / từ mã hóa đầu cuối của bạn và chạy tail -f x. Nhược điểm của luitnó là nó không hỗ trợ sự giàu có của các bảng mã được hỗ trợ bởi libiconv. Ưu điểm là nó có sẵn ở hầu hết mọi nơi.

Mã hóa thiết bị đầu cuối mã hóa đang hoạt động (in-band; hack) : ttyconvlà một hack tôi đã viết cách đây nhiều năm (ban đầu là C, sau đó được làm lại bằng Python) sử dụng libiconvđể chuyển mã I / O của thiết bị đầu cuối. Nó sinh ra một giả mới và (a) chuyển mã các ký tự bạn nhập từ mã hóa cục bộ sang mã hóa từ xa và (b) chuyển mã các ký tự bạn nhận được từ mã hóa từ xa sang mã hóa cục bộ. Tôi đã sử dụng nó để nói chuyện với các máy chủ sử dụng mã hóa không được hỗ trợ bởi các thiết bị đầu cuối Linux tiêu chuẩn. Xin lưu ý rằng tất cả các mã hóa từ xa mà tôi đã kiểm tra nó là các mã hóa một byte, vì vậy tôi không thể đảm bảo nó sẽ hoạt động cho Shift JIS. Tôi thường không tìm thấy cuộc gọi để sử dụng nó trong những ngày này, với hầu hết các hệ thống chuyển sang Unicode.

Đây là cách bạn sẽ sử dụng nó:

$ ttyconv -rsjis -- tail -f x

Nhược điểm của ttyconvtôi là tôi đã viết nó, không ai sử dụng nó ngoài tôi, nó có lẽ đầy lỗi. Tôi xuất sắc về điều này. Ưu điểm là nó sử dụng libiconv, vì vậy nếu mã hóa của bạn không bình thường, đó là cách tốt nhất của bạn. Ở lần đếm cuối cùng, ttyconv --listhỗ trợ 100 bảng mã.


Thật sự cảm ơn. ngoài băng tần không hoạt động với tôi (gnome-terminal, mặc dù nó cho phép bạn thay đổi mã hóa), nhưng ttyconv hoạt động như một bùa mê.
Eugene Beresovsky

2
Ngày nay, có luitmột phần của bộ tiện ích X11 tiêu chuẩn, tương tự như của bạn ttyconv.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles luitcũng tương tự, ngoại trừ việc nó hoạt động tốt hơn tôi nhiều. ;) Cảm ơn! Đây là lý do tại sao tôi ngừng sử dụng ở nơi đầu tiên. Trong 12 năm kể từ khi tôi cố gắng quên ngay cả tên lệnh và tôi đã tìm kiếm nó kể từ đó.
Alexios

@Gilles cũng luitlàm việc cho tôi. Tại sao bạn không biến nó thành câu trả lời 'chính thức'? Nó là một phần trong bản cài đặt của tôi (debian), và do đó dễ sử dụng nhất đối với tôi.
Eugene Beresovsky

1
Tôi đã cập nhật câu trả lời để đưa luitvào làm lựa chọn tốt nhất cho SJIS. Đáng buồn thay, có vẻ như nó không hỗ trợ mọi mã hóa libiconv. Có vẻ như tôi vẫn phải sử dụng giải pháp của riêng mình cho mục đích siêu thực của riêng tôi. :)
Alexios

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.