Vim은 이상한 캐릭터를 보여줍니다 <91>, <92>


26

Vim over SSH를 사용하는 동안 웹 페이지에서 내 SSH / Vim 세션으로 일부 내용을 복사하여 다음 결과를 얻었습니다.

SIZE=`df -h|grep $DISC|awk <91>{print $2}<92>`

분명히 <91><92>스탠드 '하지만 어떻게 검색하고이 물건을 대체 할 수 있습니까? 그리고 그 무엇을 91/ 92뜻? 어떻게 이런 일이 인코딩으로 인해됩니다 91/ 92ASCII의 평균에 \[?

답변:


23

소스 웹 페이지의 내용이 지나치게 재 포맷되었습니다. 텍스트는 의심 할 여지없이 사용했는데 (직선) (ASCII 작은 따옴표 39/0x27, U+0027) 대신 곱슬 작은 따옴표 ( U+2018하고 U+2019있으며, 0x91 and 0x92또한 MS-ANSI와 WINDOWS-1252로 알려진 CP1252 (에; Windows에서 공통의 8 비트 인코딩)) .

Vim은 16 진수 코드를 보여줍니다 .Vim이 사용하는 인코딩 (아마 UTF-8)에는 유효하지 않기 때문입니다. 파일에 이미 저장된 텍스트를 편집하는 경우 :e ++enc=cp1252;를 사용 하여 파일을 CP1252로 다시로드 할 수 있습니다 . 이렇게하면 중괄호가 표시됩니다. 그러나 CP1252로 다시로드 할 실제 이유는 없으며 0x91and 0x92문자를 삭제하고 작은 따옴표로 바꿉니다.


"Smart Quotes"기능의 일부로 중괄호 / 아포스트로피를 자동 삽입하는 MS Word에서 복사 한 컨텐츠에서 중괄호 / 아포스트로피를 종종 얻습니다. 글꼴이 해당 문자를 지원하지 않으면 문자 대신 빈 공간 만 얻게됩니다.
lambacck

1
+1:e ++enc=cp1252
wfaulk

@ChrisJohnsen, 같은 것을 달성하는 플래그로 vi를 호출하는 방법이 :e ++enc=cp1252있습니까? 명령 줄에서 MS 단어 문자가 포함 된 파일을 vi로 실행하려면 vi를 열고 :e명령으로 파일을로드하는 대신 한 단계로 수행 할 수 있으면 좋을 것입니다.
Leo Simon

@LeoSimon : vim --cmd 'set fileencodings=cp1252' /path/to/file— 명령이 일반보다 먼저 실행 .vimrc되고 fileencodings옵션을 설정하여 (끝을 참고할 s수도 있고 더 짧은 이름을 사용할 수도 fencs있음) Vim은 파일을로드 할 때 CP1252 만 시도합니다. 이는 해당 파일의 일회성 편집에는 효과가 있지만 Vim의 해당 인스턴스를 사용하여 다른 인코딩으로 파일을 편집하려는 경우 문제가 발생할 수 있습니다.
Chris Johnsen

고맙습니다!, 명백하게, 나는 지금 사용하고 있습니다vim -c"set fencs" /path/to/file
Leo Simon

27

91과 92는 MS Windows 기본 버전 인 latin1 / ISO-8859-1 인코딩의 열기 및 닫기 중괄호 (작은 따옴표)에 대한 16 진 코드이며,보다 구체적으로 cp1252 / Windows-1252 (cp는 코드를 나타냄) 페이지).

이러한 문자는 "Smart Quotes"기능의 일부로 Word 문서 / Outlook 전자 메일의 내용을 복사하는 사람들이 가장 자주 삽입합니다. 이 코드 페이지의 다른 문제 문자는 16 진수 93/94이며 큰 따옴표, 글 머리 기호 (•) 및 OE 합자 (– 및 Œ)입니다. cp1252 의 녹색으로 강조 표시된 Wikipeda 페이지 에서 동일한 코드로 ISO-8859-1 또는 UTF-8에 직접 맵핑되지 않는 "문제점"의 전체 목록을 볼 수 있습니다 .

파일을 올바른 인코딩으로 열려면 ++ enc = cp1252 옵션을 : e 명령에 사용하십시오.

:e ++enc=1252 filename.txt

Vim의 특정 잘못된 16 진 코드를 대체 명령 (: s)과 코드 대체 중 하나로 바꿀 수 있습니다.

\d123   decimal number of character
\o40    octal number of character up to 0377
\x20    hexadecimal number of character up to 0xff
\u20AC  hex. number of multibyte character up to 0xffff
\U1234  hex. number of multibyte character up to 0xffffffff

16 진수 91/92 문자를 변경하려면 다음을 수행해야합니다.

:%s/[\x91\x92]/'/g

디렉토리의 모든 파일에서 해당 문자를 바꾸려면 bash 명령을 사용하는 것이 좋습니다. 빠른 Google 검색 에서이 문제를 sed -i "s/[\x91\x92]/\'/g" *.txt해결했지만 작동하지 않았습니다.
Buttle Butkus

방금 명령 줄에 효과가있는 것으로 나타났습니다. 현재 폴더의 모든 .txt 파일을 찾거나 바꿉니다. 스위치가 무엇을하는지 전혀 모르기 때문에 이것을 사용하기 전에 perasearch perl을 사용하십시오. perl -p -i -e "s/[\x91\x92]/'/g" *.txt
Buttle Butkus

2
sed -i "s/\x92/'/g"나를 위해 일했다.
Karoly Horvath

3

iconv열기 전에 텍스트 파일을 CP1252에서 UTF-8로 변환하는 데 사용하십시오 .

iconv -f cp1252 -t utf8 inputfile.csv > outputfile.csv

Mac OS에서는 다음을 사용하십시오.

iconv -f cp1252 -t UTF8-MAC inputfile.csv  > outputfile.csv

-3

실제로 16 진 91과 92를 나타내며, Windows 코드 페이지에서는 작은 따옴표 ( '및'-Alt-0145 및 Alt-0146)를 닫고 닫는 중괄호입니다.

다음 검색 / 바꾸기를 시도하십시오.

:s%/\<9[12]\>/'/g

1
포인트가 부족하여
공감할

1
이것은 나를 위해 작동하지 않습니다 : stackoverflow.com/questions/2798398/… 작동하는 솔루션을 제공합니다.
혼란

@lambacck : 파일에 리터럴 문자열 "91"과 "92"가 포함되어 있다고 가정 하고이 경우이 명령이 정확합니다. 16 진수 문자라면 맞습니다. 대체 명령이나 이와 유사한 것이 필요합니다.
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.