“꼬리 -f | iconv -fsjis”는 아무 것도 출력하지 않습니다


14

내가 원하는 tail -f파일 만, 그 내용에 sjis나는 그것이 기본 (UTF-8) 내 터미널의 인코딩 변환이 필요하므로, 인코딩입니다.

내가 할 때

꼬리 -fx | iconv -fsjis

출력이 없습니다. 같이

꼬리 x | iconv -fsjis

처음에는 그것이 버퍼링 문제라고 생각하지만, 시도에서 작업을 수행 unbuffer하고 stdbuf에 설명 된대로 파이프에 버퍼링 끄고 도움이되지 않았다.

실제로 x에 10k가 넘는 데이터가 추가 된 후에도 출력이 없으므로 버퍼링 문제가 아니라고 생각합니다 (실수하지 않으면 버퍼가 4k입니다). 그러나 iconv는 다음과 같은 경우에만 출력을 시작합니다 EOF를받습니다.

sjis로 인코딩 된 파일을 어떻게 따라갈 수 있습니까?

답변:


11

(소금 한 덩어리로 이것을 가져 가라) 내가 기억하는 한, 문제는 libiconv작동 방식에 있습니다. 멀티 바이트 인코딩은이를 해독하기 위해 상태 머신이 필요하고 libiconv전체 문자를 수신하는 것을 선호하므로 한 함수 호출에서 절반을 문자로, 다음 문자에서 다른 문자를 반으로 줄 수는 없습니다.

다른 두 가지 솔루션을 생각할 수 있습니다. 하나는 대역 외 방법이며 다른 하나는 대역 내 해킹입니다.

터미널 에뮬레이터 인코딩 변경 (대역 외) : 하나는 터미널 에뮬레이터의 문자 인코딩을 변경하는 것이므로 기본 인코딩은 Shift JIS입니다. 방금 확인 konsole했으며 이것을 지원합니다. 메뉴에서보기 → 문자 인코딩 → Japenese → sjis. 그런 다음 tail -f파일 만 있으면 konsole멀티 바이트 문자를 디코딩하고 글꼴 글리프와 일치시킬 수 있습니다.

트랜스 밴드 터미널 인코딩 (대역 내, 최고) : Gilles가 제공 한 덕분에 luit아주 오랜 시간 을 떠올리게 되었습니다. luitXOrg 배포판과 함께 제공되는을 사용하십시오 (Debian에서는 패키지 x11-utils임). 다음과 같이 사용하십시오.

$ luit -encoding SJIS -- tail -f x

그러면 터미널 인코딩과 터미널 인코딩간에 SJIS가 트랜스 코딩되고 실행 tail -f x됩니다. 단점은에서 luit지원하는 풍부한 인코딩을 지원하지 않는다는 것 libiconv입니다. 단점은 거의 모든 곳에서 사용할 수 있다는 것입니다.

트랜스 코딩 터미널 인코딩 (인 밴드, 해킹) : 터미널 I / O를 트랜스 코딩 하는 데 사용 하는 ttyconv몇 년 전 (초기 C에서 나중에 파이썬에서 다시 작성) 작성한 해킹libiconv 입니다. 새로운 의사 터미널을 생성하고 (a) 로컬 인코딩에서 입력 한 문자를 원격 인코딩으로 코드 변환하고, (b) 원격 인코딩에서 수신 한 문자를 로컬 인코딩으로 코드 변환합니다. 표준 Linux 터미널에서 지원하지 않는 인코딩을 사용하는 서버와 통신하는 데 사용했습니다. 내가 테스트 한 모든 원격 인코딩은 단일 바이트 인코딩이므로 Shift JIS에서 작동한다고 보장 할 수 없습니다. 요즘 대부분의 시스템이 유니 코드로 전환되면서 요즘 사용하는 전화를 찾지 못하는 경우가 많습니다.

이것이 당신이 그것을 사용하는 방법입니다 :

$ ttyconv -rsjis -- tail -f x

단점은 ttyconv내가 쓴 것이지만 아무도 사용하지 않고 버그로 가득 차있을 것입니다. 나는 이것에 뛰어납니다. 단점은을 사용한다는 것입니다 libiconv. 따라서 인코딩이 특이한 경우 가장 좋습니다. 마지막으로 ttyconv --list100 개의 인코딩을 지원합니다.


정말 고마워 대역 외가 나를 위해 작동하지 않았습니다 (그놈 터미널은 인코딩을 변경할 수 있지만), ttyconv는 매력처럼 작동합니다.
Eugene Beresovsky 1

2
요즘 luit에는 표준 X11 유틸리티 제품군의 일부가 있습니다 ttyconv.
Gilles 'SO- 악한 중지'

@Gilles luit는 내 것보다 훨씬 잘 작동한다는 점을 제외하면 비슷합니다. ;) 감사! 이것이 처음부터 사용을 중단 한 이유입니다. 명령 이름조차 잊어 버린 이후 12 년 동안 나는 그 이후로 그것을 찾고 있습니다.
Alexios

@Gilles luit도 저에게 효과적입니다. 왜 '공식적인'답변이되지 않습니까? 그것은 내 설치 (데비안)의 일부이므로 나에게 가장 사용하기 쉽습니다.
Eugene Beresovsky

1
luitSJIS를위한 최선의 선택 으로 포함하도록 답변을 업데이트했습니다 . 안타깝게도 모든 인코딩 libiconv이 지원하는 것은 아닙니다 . 여전히 초현실적 인 목적으로 자체 솔루션을 사용해야하는 것 같습니다. :)
Alexios

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.