vim 인코딩 설정에 대한 심층적인 이해
vim의 사용 환경은 비교적 복잡합니다. 터미널(Mac이나 Linux 호스트 등)을 통해 로컬에서 사용할 수도 있고, SSH를 사용하여 원격 서버에 연결할 수도 있고, gvim을 사용할 수도 있습니다. .
여기서는 주로 터미널에서의 사용에 대해 논의합니다. 터미널에서 vim의 인코딩 설정을 명확히 했습니다. gvim은 비교적 간단하므로 자연스럽게 이해할 수 있습니다.
우선 차이점을 이해해야 합니다. 문자와 바이트 사이에는 문자가 사용되며, 바이트는 저장 및 전송에 사용됩니다. 네트워크 전송은 바이트 스트림으로 파일 내용을 표시하려면 편집기에서 이를 변환해야 합니다. 표시할 문자 문자와 바이트 사이의 관계는 다음과 같이 정의할 수 있습니다.
인코딩과 디코딩은 둘 다 인코딩 방식을 지정해야 하는 한 쌍의 작업임을 알 수 있습니다. 체계가 일관되지 않으면 작업이 실패합니다.
터미널을 통해 작동합니다. 원격 vim을 사용할 때 데이터 흐름 방향은 다음과 같이 표현할 수 있습니다.
이 흐름 방향에서는 터미널과 vim만 필요합니다. 문자를 표시하고 다른 프로세스나 서비스는 데이터 전송만 수행합니다. 바이너리 데이터만 전송하는 경우에는 이를 포함할 필요가 없습니다. 인코딩 및 디코딩은 문자가 표시될 때만 디코딩하면 되므로 터미널과 vim만 인코딩을 구성하면 됩니다. , 터미널은 로컬 셸을 처리해야 하지만 원격 vim도 셸을 처리해야 하며 셸의 인코딩도 중요합니다.
터미널 자체도 최종 문자 표시에 필요한 프로세스입니다. 터미널에 입력한 문자도 터미널에 의해 인코딩된 후 전송됩니다. 간단히 말하면,
다음은 코드입니다. 디코딩 방식은 터미널에서 구성해야 하는 것입니다. /p>
locale 명령은 쉘 인코딩 설정도 볼 수 있습니다. LC_로 시작하는 인코딩 체계는 시스템의 다양한 유형의 인코딩 체계를 나타내며, 이는 다음 범주로 나뉩니다.
final 어떤 계획을 선택할 것인지 그 우선순위는 다음과 같습니다
즉, 모두 LC_ALL을 기준으로 합니다. 설정이 없으면 LC_*에 해당하는 설정 항목을 찾습니다. 설정에서는 LANG 설정을 사용하여 문자에 영향을 줍니다. 설명의 편의를 위해 나중에 쉘 인코딩을 언급할 때 쉘 인코딩 방법은 다음과 같이 설정됩니다. /p>
로컬 터미널 인코딩이 UTF-8로 설정되고 쉘 인코딩이 GBK로 설정되어 있다고 가정합니다. 터미널에 중국어 문자를 입력하면 문자가 깨져서 표시되거나 표시되지 않습니다.
터미널에 셸 명령을 입력할 때 데이터 상호 작용을 분석해 보겠습니다.
터미널과 셸을 두 개의 서비스가 서로 상호 작용해야 한다고 생각하면 데이터를 보낼 때 인코딩하고 데이터를 받을 때 디코딩할 수 있습니다. 인코딩 체계와 디코딩 체계가 일치하지 않으면 문자가 깨지거나 터미널에 중국어를 입력하는 데 실패할 수 있으며 명령 실행 결과가 예상과 다릅니다.
ssh를 사용하여 원격 셸에 로그인하면 원격 셸의 인코딩 구성이 로컬 셸과 일치합니다. ssh -v를 통해 로그인 과정에서 ssh가 수행한 작업을 출력할 수 있습니다. p> 그래서 첫 번째 요점은
vim과 인코딩에 관련된 4가지 설정이 있다는 것입니다.
vim의 인코딩 설정이 상당히 복잡하다는 것을 알 수 있습니다. 구체적인 예가 포함된 인코딩 설정
로컬 vim을 열든 원격 vim을 열든 먼저 로컬 셸의 인코딩 설정이 인코딩 및 디코딩 데이터 흐름과 관련된 터미널과 일치하는지 확인해야 합니다.
Vim이 파일을 열고 최종적으로 터미널에 표시합니다. 이 프로세스는 인코딩 설정과 관련이 있습니다.
Vim에 인코딩이 많이 있는 것을 볼 수 있습니다. 파일을 열고 표시하는 과정에서 바이너리를 A 인코딩에서 B 인코딩으로 변환하는 단계는 다음과 같습니다.
최종 출력은 여전히 바이트 스트림입니다. 바이트 스트림이 입력과 다릅니다(ascii 바이트 스트림을 제외하고 모든 인코딩 체계의 ascii 문자).
기호에 해당하는 바이트 스트림은 동일합니다.) 성공적인 변환을 위한 전제 조건은 디코드에 사용된 인코딩 체계가 입력 바이트 스트림 인코딩 체계와 일치해야 한다는 것입니다. 즉, 입력 바이트 스트림이 C 인코딩 체계를 사용하여 생성된 경우 A 인코딩 체계를 사용한 디코딩은 실패합니다.
vim의 일부 인코딩 항목이 설정되지 않은 경우 종속성 설정 또는 기본 설정이 사용됩니다.
이러한 vim 인코딩 설정에서는 일반적으로 다음과 같습니다. 파일 인코딩과 인코딩만 설정합니다. 중국어, 영어 환경에서만 사용하는 경우 다음과 같이 설정할 수 있습니다.
utf8은 모든 문자를 나타낼 수 있으므로 인코딩을 utf8로 설정해야 합니다.
터미널 인코딩이 gbk로 설정되어 있고 vim의 인코딩이 utf8이라고 가정하면 이때 파일을 엽니다. 파일이 utf8이든 gbk 인코딩이든 관계없이 정상적으로 표시될 수 없습니다.
언급한 바와 같이 이전에 vim의 termencoding은 기본적으로 인코딩 설정을 상속하며 파일을 여는 해당 단계는 다음과 같습니다.
정상적으로 표시하려면 vim의 termencoding 인코딩을 임시로 수정하면 됩니다. 터미널 인코딩과 일치해야 합니다. 용어 코딩은 표시만 포함하며 파일 내용의 변경은 포함하지 않습니다. 정확하게 말하면 인코딩 설정을 수정하지 마십시오.
따라서 두 번째 요점은
파일을 여는 데이터 흐름이 vim에서 터미널로 진행되는 경우 파일 수정은 터미널에서 vim으로, 그런 다음 터미널로 왔다 갔다 합니다.
인코딩과 관련된 단계는 다음과 같습니다. 표시할 파일을 여는 과정은 앞서 설명했습니다. 여기서는 수정 및 저장 과정에 대해서만 설명합니다.
파일인코딩에는 두 가지 상황이 있습니다.
위에서 볼 수 있듯이 인코딩 방식으로 인코딩된 데이터는 vim에서 전송 스테이션으로 데이터를 수신(파일에서 읽거나 터미널에서 입력)할 때 인코딩 방식으로 변환해야 하며, 그러면 파일 인코딩 방식이 파일 인코딩 방식으로 변환됩니다. 따라서 인코딩은 모든 문자를 표현할 수 있는 인코딩 방식으로 설정해야 합니다. 보통 utf8로 설정합니다.
터미널과 셸의 인코딩 설정이 모두 gbk이고, vim의 인코딩은 다음과 같다고 가정합니다. utf8로 설정하면 문자를 입력하고 표시하려면 termencoding 설정이 터미널 인코딩과 일치해야 합니다. 즉, 문자를 표시하거나 파일을 저장하기 위해 문자를 입력하면 정상적으로 작동할 수 있습니다.
인코딩의 영향을 보여주기 위해 인코딩을 일관되지 않게 설정할 수 있습니다. 실제 환경에서는 이러한 인코딩 설정이 일관되게 유지되어야 하므로 궁극적인 요점은