write
프로그램을 사용하여 메시지를 보낼 때 UTF-8 문자를 어떻게 사용합니까?
나는 다음을 보낸다:
write user2
Ehilà! Com'è?
그러나 수신자는 다음을 얻습니다.
Message from user1@samehost on pts/1 at 21:08 ...
EhilM-CM- ! Com'M-CM-(?
기계는 동일하며 LANG
konsole에서도 이미 동일합니다 en_US.UTF-8
.
답변1
write
상위 비트를 "메타"( Meta+key 또는 키)로 해석하는 것 같습니다 Esc. 소스 코드( wr_fputs()
의 기능 write.c
)를 잠깐 살펴보면 이를 확인할 수 있습니다. 제어 문자는 로 표시되고 ^X
상위 비트 세트 문자는 로 표시됩니다 M-X
. 유감스럽게도 로케일, 터미널 및 인코딩은 이와 관련이 없습니다. write
단 7비트입니다.
저는 유니코드 팬이지만 이것은 약간 비뚤어진 것입니다. write
대상 TTY를 열고 여기에 쓰기만 하면 됩니다(마법이 필요하지 않음). 원격 TTY를 제어하는 프로세스가 문자 인코딩을 이해하도록 하는 쉬운 방법은 없습니다. 존재하더라도 모든 인코딩을 다른 모든 인코딩으로 변환할 수 있는 것은 아닙니다. 변환하지 않으면 KOI8-R에서 ISO-8859-1 콘솔로 메시지를 전송할 수 없습니다. write
단순한 70년대 접근 방식 덕분에 이것이 우리가 얻는 것입니다.
답변2
FIFO 파이프를 사용하면 이를 달성할 수 있습니다.
- FIFO 파이프를 생성합니다:
mkfifo /tmp/fifo
- 다른 사용자가 상대방의 말을 듣도록 하십시오. 이 파이프에서 여러 메시지를 기다리는 경우 편의상 읽기 파이프라인 명령을
for
루프에 넣어 리스너가 첫 번째 메시지를 받으면EOF
bash가 자동으로 파이프에 다시 연결되도록 할 수 있습니다. 필요할 때 Ctrl+를 사용하여 이 루프 실행을 중단 할 수 있습니다.Cfor ((i=0;i<100;i++)) do cat /tmp/fifo ; done
- 그런 다음 유니코드 텍스트 메시지를 보내거나 명령의 출력을 이 FIFO 파이프로 리디렉션할 수 있습니다. 예를 들면 다음과 같습니다.
ls -l /bin/ > /tmp/fifo