답변:
시도해 볼 수 있습니다 :
%s/<CTRL-2>//g
(일반 PC)
%s/<CTRL-SHIFT-2>//g
(Mac PC에서)
어디서 <CTRL-2>
다운을 누르는 것을 의미 CTRL눌려로 유지하는 일반 PC에서를, 공격 2, 릴리스 CTRL.
그리고 <CTRL-SHIFT-2>
먼저 controlMac PC에서 눌린 상태를 shift유지하고 Mac PC를 눌렀을 때 누른 상태 2, 눌렀다 놓기 control및 놓기 상태를 유지하는 것을 의미합니다 shift.
마지막으로 두 명령 모두 %s/^@//g
화면에 나타납니다. ^@
는 단일 문자 (NULL 바이트, 그렇지 않으면 표시 할 수 없음)를 의미하며 ^
뒤에 오는 문자가 아니므로 위 명령에서 @
입력 ^
하고 @
한 행에 넣을 수 없습니다 .
이 명령은 모든을 제거합니다 ^@
.
파일이 손상되었다고 생각하지 않습니다. 예제 줄에는 각 문자 사이에 null 바이트가있는 일반 텍스트가 포함 된 것처럼 보입니다. 이것은 UTF-16으로 인코딩 된 텍스트 파일이지만 파일의 시작 부분에서 바이트 순서 표시가 누락되었음을 나타냅니다. http://en.wikipedia.org/wiki/Byte-order_mark 참조
메모장을 열고 'filename'이라는 단어를 입력하고 유니 코드 Big-endian으로 저장한다고 가정 해 봅시다. 이 파일의 16 진 덤프는 다음과 같습니다.
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
이 파일을 Vim에서 열면 괜찮아 보입니다- 'fe ff'바이트는 Vim에게 파일이 어떻게 인코딩되는지 알려줍니다. 이제 정확히 동일한 바이트 시퀀스를 포함하지만 선행 'fe ff'가없는 파일을 작성한다고 가정하십시오. Vim은 널 바이트 대신 ^ @ (또는 구성에 따라 <00>)을 삽입합니다. 메모장은 공백을 삽입합니다.
따라서 null을 제거하는 대신 Vim이 파일을 올바르게 해석하도록 유도해야합니다. Vim이 다음 명령을 사용하여 올바른 인코딩으로 파일을 다시로드 할 수 있습니다.
:e ++enc=utf16
이것은 실제로 vim 내에서 나를 위해 일했습니다.
:%s/\%x00//g
<Ctrl-V><Ctrl-2>
(와 함께뿐만 아니라 <Ctrl-Shift-2>
) 작동하지 못했지만 이것이 효과가있었습니다.
다른 사람들이 지적했듯이, 이들은 null 바이트입니다 (ASCII 00). Linux에서 vim에 ASCII 값을 입력하는 방법은 Ctrl-V를 누른 다음 임의의 문자의 3 자리 8 진 값을 누르는 것입니다. 모든 널 바이트를 바꾸려면 다음을 사용하십시오.
:%s/
Ctrl-V000//g
(공백 없음).
마찬가지로 다음을 사용하여 null을 검색 할 수 있습니다.
/
Ctrl-V000
두 경우 모두 0을 입력 할 때 0이 표시되지 않지만 3 개를 모두 입력하면가 표시됩니다 ^@
. 컬러 터미널에서는 파란색으로 표시되어 제어 문자임을 나타냅니다.
FWIW, 내 경우에는 cygwin에서 vim을 사용하여 Mac에서 만든 텍스트 파일을 편집해야했습니다. 받아 들여진 해결책은 나를 위해 작동하지 않았지만 가깝습니다. Unicode 작업에 관한 Vim 위키 페이지에 따르면 BOM 바이트의 Big Endian 버전과 Little Endian 버전간에 차이가 있습니다. 따라서 vim
Little Endian 버전의 BOM 인코딩을 사용 하도록 명시 적으로 지시해야했습니다 .
올바른 인코딩을 선택한 후에 만 파일 형식 (줄 끝)을 변환하여 dos
Windows 편집기에서 파일을 편집 할 수있었습니다. 인코딩을 지정하기 전에 파일 형식을 재설정하려고하면 슬픔이 생겼습니다. 내가 사용한 전체 명령 목록은 다음과 같습니다.
:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
@jrb의 답변 외에도 Vim에서 파일의 문자 인코딩은 fileencodings 옵션을 기반으로 감지됩니다. (파일 인코딩의 끝에 's'를 기록하십시오)
즉, Windows의 경우 fileencodings
옵션 의 기본값 ucs-bom
은입니다.
파일 시작 부분에 BOM이 있는지 확인하십시오.
BOM이 있으면 'BOM에서 파일의 문자 인코딩을 읽으십시오'.
BOM이 존재하지 않는 경우 (이 경우 fileencodings
옵션에 지정된 모든 문자 인코딩 이 일치하지 않음을 의미하는 경우 ) encoding
옵션에 지정된 문자 인코딩으로 파일을 읽으십시오 . encoding
옵션 의 기본 문자 인코딩 은 다음과 같습니다 latin1
. 이제 때문이 latin1
는 IS 한 바이트 길이 문자 인코딩은, 모든 파일의 바이트 유효 latin1
문자 (심지어 Nul
문자 ^@
는 *보고있다).
*-실제로, ^@
Nul 문자가 아닌 Vim의 버퍼 텍스트에서 개행 문자입니다.
파일을 읽는 올바른 방법은 문자 인코딩을 UTF-16으로 수동으로 지정하는 것입니다 (UTF-16이이 경우 적절한 문자 인코딩 인 것처럼 보입니다).