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 --list
100개의 인코딩이 지원되었습니다.
답변2
Rich Felker가 C로 쓴 것과 ttyconv
비슷합니다 .tconv