터미널을 손상시키지 않고 바이너리 데이터를 있는 그대로 인쇄합니다.

터미널을 손상시키지 않고 바이너리 데이터를 있는 그대로 인쇄합니다.

나는 썼다Python 모듈객체를 덤프합니다. 그러나 터미널( ) numpy.ndarray에 바이너리 데이터(예를 들어)를 보유하는 객체와 함께 이것을 사용할 때 데이터를 인쇄하면 터미널의 글꼴이 깨집니다. 분명히 특정 문자는 터미널 제어 시퀀스로 처리됩니다. Windows에서는 Cygwin 터미널에서도 인쇄가 제대로 작동합니다 .linuxTERM=linuxminttyTERM=xterm

cat바이너리 파일을 사용할 때도 같은 일이 발생합니다.

물론 이 문제를 해결하기 위해 를 사용할 수 있지만 reset출력이 손실되고 일반적으로 불편해지는 대가를 치르게 됩니다. 나도 알고 있지만전부는 아니지만 대부분의 제어 문자에는 글꼴에 대체 그래픽 표현이 있습니다.(예를 들어 의 경우 CR입니다 .)

그래서,linux터미널이 특수 문자를 리터럴로 처리 하도록 원래 스트림을 변경하는 방법이 있습니까 ?기본적으로 다음과 같은 것을 보고 싶습니다.

바이너리 데이터 출력 예

나는 주로 프로그래밍 방식(= 터미널 관점에서 수행해야 하는 작업 및 공용 시스템 라이브러리(있는 경우)의 구현)에 관심이 있습니다.

Python은 repr()내 요구 사항에 적합하지 않습니다. 인쇄할 수 없는 ASCII 문자를 국가 문자를 포함한 가변 길이 시퀀스로 확장하는 반면, 모듈은 덤프 인쇄물을 간결하고 읽기 쉽게 만들도록 설계되었습니다.

답변1

이것showconsolefont이 프로그램은 256가지(또는 512가지...)를 표시할 수 있습니다.문자 모양Linux 콘솔에서 즉시. 하지만 이를 수행하기 위해 시스템 호출을 사용합니다(이는 콘솔 장치에 대한 연결에만 작동합니다). 매뉴얼 페이지에는 이에 대한 언급이 없습니다.

하지만문자 모양(문자를 표시하는 데 사용)수치. 문자를 터미널에 인쇄하여 표시한 다음 문자 모양으로 매핑합니다. Linux 콘솔에 제어 문자를 인쇄 가능한 것으로 처리하도록 지시하는 이스케이프 시퀀스는 없습니다.

예를 들어 showconsolefont실제로는 그렇지 않습니다.쓰다셀 0-31의 제어 문자입니다. 그것지도시스템 호출을 사용하여 인쇄 가능한 문자를 0-31 범위로 변환합니다.

추가 자료:

답변2

나는 바꿀 수 있는 방법을 모른다단말기모든 문자가 허용됩니다. 제어 문자는 다음과 같습니다.특징일반적으로 터미널 유형에 주의를 기울이고, 사용하려는 터미널 기능에 대한 올바른 제어 문자를 생성하고, 인쇄하려는 제어 문자를 이스케이프하는 것은 프로그램의 책임입니다.

예를 들어, Python 프로그램을 변경하여 이를 수행하는 방법에 대한 정보는 다음에서 찾을 수 있습니다.이것스택오버플로 질문입니다.

셸에서는 예를 들어 tr제어 문자를 다른 ASCII 문자(유니코드 문자는 아님)로 변환하는 데 사용할 수 있습니다. 바라보다이것유니코드 문자를 사용할 수 있는 대안에 대한 질문입니다.

유니코드는제어 화면캐리지 리턴과 같은 그룹 표시 제어 문자입니다 . CR이 CR을 의미한다는 것을 들어본 적이 없다면 , 사용하는 일부 글꼴에서는 순전히 우연일 것입니다.

셸에서는 cat바이너리를 가져오는 것이 아니라 hexdump -C유사한 것을 사용하여 검사합니다.

관련 정보