이것이 어떤 16진수 ASCII 문자인지 어떻게 식별합니까?

이것이 어떤 16진수 ASCII 문자인지 어떻게 식별합니까?

텍스트 파일이 있고 "잘못된" 문자를 정리하고 싶습니다. vim으로 열면 (":set number" 사용):

57000044 zo¥<9a>¥ge¥o¥graph¥i¥cal¥ly
39999999 pariá¹<83>Å<9b>a

예를 들어, "<9a>", "<83>", "<9b>"는 vim에서 파란색으로 표시되며, 이 두 줄은 vim 외부에서 다음과 같습니다.

$ sed '57000044,57000044!d' toclean.txt
zo���ge�o�graph�i�cal�ly
$ sed '57000044,57000044!d' toclean.txt | cat -vte -
zoM-%M-^ZM-%geM-%oM-%graphM-%iM-%calM-%ly$
$ 

그리고

$ sed '39999999,39999999!d' toclean.txt
pariṃśa
$ sed '39999999,39999999!d' toclean.txt | cat -vte -
pariM-aM-9M-^CM-EM-^[a$
$ 

질문:위의 "<9a>", "<83>" 및 "<9b>"에 대한 16진수 ASCII 문자가 무엇인지 어떻게 알 수 있습니까? 또는 "1" 또는 "¥"...

파일을 모두 제거하여 더 깔끔하게 만들려면 16진수 코드가 필요합니다. 예를 들어 이 코드는 16진수 ASCII "x09"를 제거하므로 "가로 탭"이 됩니다.

sed -i 's/[\x09]//g' toclean.txt

16진수로 "9A" 또는 "A5"를 사용해 보았지만 도움이 되지 않았습니다.

$ sed '57000044,57000044!d' toclean.txt | sed 's/[\x9A]//g; s/[\xA5]//g'
zo���ge�o�graph�i�cal�ly
zo���ge�o�graph�i�cal�ly
$ 

답변1

hex:<9a> 및 hex:<83> 코드는 ASCII 코드가 아닙니다(ASCII 코드는 <00>부터 <7F>까지만 가능). 또한 어떤 문자(ASCII보다 큰 문자 집합에서)가 이러한 코드와 연관되어 있는지 "찾을" 수 없습니다. 이는 기본 문자 집합("코드 페이지") 인코딩에 따라 달라지기 때문입니다. 따라서 데이터를 만든 사람에게 어떤 문자 인코딩을 사용했는지 물어봐야 합니다. (종종 찾을 수 있는 일반적인 인코딩은 ISO 8859-1, ISO 8859-15, UTF-8, UCS-2입니다. 온라인에서 찾은 코드 테이블을 확인하여 이러한 인덱스가 있는 문자가 데이터 컨텍스트에서 가장 의미가 있는지 확인할 수도 있습니다. .)

삭제하려는 코드 값을 알고 나면 (예를 들어) 옵션 (8진 인수) tr과 함께 명령을 사용할 수 있습니다.-d

답변2

ASCII 코드7비트 문자 집합입니다. 128보다 큰 값을 갖는 문자는 ASCII가 아닌 문자입니다.

당신이 사용하는 경우유니코드, 문자는 여러 바이트로 표시됩니다(256개의 서로 다른 바이트 값만 있지만 유니코드 문자는 100,000개 이상임). 유니코드의 사실상의 표준 표현은 다음과 같습니다.UTF-8각 문자는 가변 개수의 바이트를 사용합니다. ASCII 문자는 단일 바이트로 표시되고 다른 문자는 2~4바이트로 표시됩니다.

Vim은 일부 문자를 파란색 자리 표시자로 표시합니다. 예를 들어 <9a>이 바이트는 현재 지정된 문자 집합의 유효한 문자 표현에 속하지 않기 때문입니다.로케일.

바이트를 처리하려면 로케일을 LC_CTYPE로 설정하십시오 C.

LC_CTYPE=C vim toclean.txt

UTF-8을 사용하려면 유니코드 터미널에서 Vim을 실행하세요.

다음을 사용하여 파일의 바이트를 표시할 수 있습니다.od(POSIX) 또는hexdump(BSD, Linux에서 일반적임).

od -t x1 toclean.txt
hexdump -C toclean.txt
hd toclean.txt

특정 바이트 값을 제거하려면 다음을 사용할 수 있습니다.tr.

LC_CTYPE=C tr -d '\x83\xa5' toclean.txt >clean.txt

일부 UTF-8 문자를 확실히 제거하려면 tr다음과 같이 UTF-8 인코딩이 있는 로케일에서 사용하십시오.

LC_CTYPE=en_US.utf8 tr -d '¥' toclean.txt >clean.txt

답변3

텍스트 파일에서 "ASCII가 아닌" 문자를 제거하기 위해 찾을 수 있는 가장 간단한 해결책은 다음과 같습니다.이 스레드.

$ tr -cd '\000-\777' <더티 파일> 클린 파일

'\000-\777'은 8진수 ASCII 세트를 정의합니다. "-c"는 "non-ASCII"라고도 알려진 주어진 세트를 보완하고 "-d"는 문자를 제거합니다.

답변4

그냥 사용할 수 있습니다 luit. 목적은깨끗한터미널 텍스트는 시스템의 인코딩에 맞게 조정되며 유니코드를 올바르게 처리하지 않는 응용 프로그램과 터미널 사이에서 투명도 필터 역할을 합니다. 또는 그 반대의 경우도 마찬가지입니다.

거의 확실히 설치되어 있습니다. 호스트에서 인코딩 문제를 감지하면 자동으로 호출되기 X때문에 표준으로 제공됩니다.xterm

해당 man페이지에서는 다음과 상호 작용하는 예를 설명합니다 Emacs.

  • luit또한 시스템에서 일반적으로 사용되는 인코딩과 다른 인코딩이 내장되어 있거나 다국어 출력을 위해 레거시 이스케이프 시퀀스를 사용하려는 애플리케이션에도 유용합니다. 특히 EmacsUTF-8에서 제대로 작동하지 않는 버전은 luit다국어 출력에 사용할 수 있습니다.

    $ luit -encoding 'ISO 8859-1' emacs -nw
    
  • 그런 다음 Emacs,

     M-x      set-terminal-coding-system      RET
     iso-2022-8bit-ss2 RET
    

그러나 직접 터미널 애플리케이션 외에도 다음을 지원합니다.

-c     Function as a simple converter from standard
       input to standard output.

그럼 이렇게 사용될 수도 있겠네요...

luit -c <infile >outfile

관련 정보