"tail -f | iconv -fsjis"는 아무것도 출력하지 않습니다.

"tail -f | iconv -fsjis"는 아무것도 출력하지 않습니다.

tail -f파일을 원 하지만 그 내용이 sjis인코딩되어 있으므로 터미널의 기본(utf-8) 인코딩으로 변환해야 합니다.

내가 할 때

tail-FX |

출력이 없습니다. ~처럼

tailx |

작동합니다. 처음에는 버퍼링 문제라고 생각했지만 위와 같이 unbuffer시도 했습니다.stdbuf파이프라인에서 버퍼링 끄기도움이 안돼.

실제로 10,000개가 넘는 데이터를 추가해도 EOF가 수신되었습니다.

그렇다면 sjis로 인코딩된 파일을 어떻게 추적할 수 있나요?

답변1

(이것을 약간의 소금으로 받아들이십시오.) 내가 알 수 있는 한, 문제는 libiconv그것이 작동하는 방식입니다. 멀티바이트 인코딩은 이를 디코딩하기 위해 상태 머신이 필요하며 libiconv전체 문자 수신을 선호하므로 한 함수 호출에 문자 절반을 제공하고 다음 함수 호출에 나머지 절반을 제공할 수는 없습니다.

나는 좋은 대역외 접근 방식과 대역내 해킹이라는 두 가지 다른 솔루션을 생각할 수 있습니다.

터미널 에뮬레이터 인코딩 변경(대역 외): 하나는 기본 인코딩이 Shift JIS가 되도록 터미널 에뮬레이터의 문자 인코딩을 변경하는 것입니다. 방금 확인해보니 konsole이 기능이 지원됩니다. 메뉴에서 보기 → 문자 인코딩 → 일본어 → sjis를 선택하세요. 그런 다음 tail -f파일을 처리 하고 konsole멀티바이트 문자를 디코딩하여 글꼴 문자와 일치시키는 작업을 처리할 수 있습니다.

동적 트랜스코딩 엔드포인트 인코딩(대역 내, 최적)luit: 오랜만에 생각나는 자일스님의 글입니다 . 를 사용 luit하려면 XOrg 배포판과 함께 제공되어야 합니다(Debian에서는 package 입니다 x11-utils). 다음과 같이 사용하세요:

$ luit -encoding SJIS -- tail -f x

이렇게 하면 터미널이 SJIS를 터미널 인코딩으로/에서 트랜스코딩하고 tail -f x. 단점은 luit지원되는 풍부한 인코딩을 지원하지 않는다는 것입니다 libiconv. 장점은 거의 모든 곳에서 사용할 수 있다는 것입니다.

동적 트랜스코딩 단말 인코딩(대역 내, 해커):ttyconv몇년전에 쓴 해킹글이에요(원래는 C로, 나중에 Python으로 재작업) libiconv터미널 I/O를 트랜스코딩하기 위한 것입니다. 새로운 의사 터미널을 생성하고 (a) 입력한 문자를 로컬 인코딩에서 원격 인코딩으로 트랜스코딩하고, (b) 원격 인코딩에서 받은 문자를 로컬 인코딩으로 트랜스코딩합니다. 표준 Linux 터미널에서 지원하지 않는 인코딩을 사용하여 서버와 통신하는 데 사용합니다. 제가 테스트한 모든 원격 인코딩은 단일 바이트 인코딩이므로 Shift JIS에서 작동한다고 보장할 수 없습니다. 요즘에는 대부분의 시스템이 유니코드로 전환되면서 이를 사용하는 휴대폰을 자주 찾을 수 없습니다.

다음과 같이 사용할 수 있습니다.

$ ttyconv -rsjis -- tail -f x

단점 ttyconv은 내가 썼다는 것, 나 외에는 아무도 사용하지 않고, 아마 버그가 가득할 거라는 점이다. 나는 이것을 잘한다. 좋은 점은 을 사용한다는 것입니다 libiconv. 따라서 코딩이 특이한 경우 이것이 최선의 선택입니다. 마지막으로 ttyconv --list100개의 인코딩이 지원되었습니다.

답변2

Rich Felker가 C로 쓴 것과 ttyconv비슷합니다 .tconv

바라보다:Re: aterm/rxvt/etc를 수정하려면 전화하세요...

관련 정보