tail -f
파일을 원 하지만 해당 내용이 sjis
인코딩되어 있으므로 터미널의 기본(utf-8) 인코딩으로 변환해야 합니다.
내가 할 때
꼬리 -fx | iconv -fsjis
출력이 없을 것입니다. 처럼
꼬리 x | iconv -fsjis
작동합니다. 처음 에는 버퍼링 문제인 unbuffer
줄 알았어요.stdbuf
파이프에서 버퍼링 끄기도움이되지 않았습니다.
사실 x에 10k가 넘는 데이터를 추가해도 출력이 나오지 않을 테니 버퍼링 문제는 아닌 것 같지만(제가 착각하지 않으면 버퍼는 4k입니다), iconv는 다음과 같은 경우에만 출력을 시작합니다. 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
also 와 유사합니다 .tconv