"쓰기" 메시지 프로그램에서 UTF-8 문자 사용

"쓰기" 메시지 프로그램에서 UTF-8 문자 사용

write프로그램을 사용하여 메시지를 보낼 때 UTF-8 문자를 어떻게 사용합니까?

나는 다음을 보낸다:

write user2
Ehilà! Com'è?

그러나 수신자는 다음을 얻습니다.

Message from user1@samehost on pts/1 at 21:08 ...
EhilM-CM- ! Com'M-CM-(?

기계는 동일하며 LANGkonsole에서도 이미 동일합니다 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 파이프를 사용하면 이를 달성할 수 있습니다.

  1. FIFO 파이프를 생성합니다:
    mkfifo /tmp/fifo
    
  2. 다른 사용자가 상대방의 말을 듣도록 하십시오. 이 파이프에서 여러 메시지를 기다리는 경우 편의상 읽기 파이프라인 명령을  for루프에 넣어 리스너가 첫 번째 메시지를 받으면 EOFbash가 자동으로 파이프에 다시 연결되도록 할 수 있습니다. 필요할 때 Ctrl+를 사용하여 이 루프 실행을 중단 할 수 있습니다.C
    for ((i=0;i<100;i++)) do cat /tmp/fifo ; done
    
  3. 그런 다음 유니코드 텍스트 메시지를 보내거나 명령의 출력을 이 FIFO 파이프로 리디렉션할 수 있습니다. 예를 들면 다음과 같습니다.
    ls -l /bin/ > /tmp/fifo
    

관련 정보