첫째, 문자와 바이트의 차이점을 이해해야합니다. 문자는 표시에 사용되고 바이트는 저장 및 전송에 사용됩니다. 네트워크 전송은 바이트 스트림이며 파일도 바이트 스트림에 저장됩니다. 편집기에서 파일의 내용을 표시하려면 문자로 변환해야 합니다. 문자와 바이트 사이의 관계는 다음과 같이 정의할 수 있습니다
인코딩과 디코딩은 한 쌍의 반대 작업이며 모두 인코딩 체계를 지정해야 한다는 것을 알 수 있습니다. 인코딩 체계가 일치하지 않으면 작업이 실패합니다.
터미널을 통해 원격 vim 을 조작할 때 해당 데이터 흐름 방향은 다음과 같이 나타낼 수 있습니다.
이 프로세스 방향에서는 터미널과 vim 만 문자를 표시해야 하고, 다른 프로세스나 서비스는 데이터 전송만 합니다. 이진 데이터만 전송하는 경우 인코딩 및 디코딩이 필요하지 않으며 문자가 표시되는 경우에만 디코딩이 필요합니다. 따라서 터미널과 vim 만 코드를 구성해야 하고 터미널은 로컬 셸을 처리해야 하며 원격 vim 도 셸을 처리해야 합니다. 껍데기의 코드화도 중요하다.
터미널 자체는 프로세스이며, 최종 문자 표시는 터미널을 완성해야 한다는 것을 보여준다. 터미널에 입력한 문자도 전송 전에 인코딩됩니다. 간단히 말해서, 그것은
이곳의 코덱 방안은 단말기를 구성해야 하는 것이다.
Locale 명령은 셸 인코딩 설정도 볼 수 있습니다. LC_ 로 시작하는 코딩 체계는 다음과 같은 범주로 구성된 시스템의 여러 범주를 나타냅니다.
최종 방안의 우선 순위는 다음과 같다
즉, 모든 것이 LC_ALL 을 기반으로 합니다. 설정되지 않은 경우 LC_* 에 해당하는 설정 항목을 찾습니다. 아직 설정되지 않은 경우 LANG 의 설정을 사용하여 LC_CTYPE 프로젝트를 표시합니다. 설명을 위해 셸 인코딩에 대한 모든 후속 참조는 shell _ allitem 을 가리키며 셸 인코딩 방법은 다음과 같이 설정됩니다.
로컬 터미널 인코딩이 UTF-8 로 설정되고 셸 인코딩이 GBK 로 설정되어 있다고 가정합니다. 터미널에 한자를 입력하면 문자가 깨져 보이거나 표시되지 않습니다.
터미널에서 셸 명령을 입력할 때의 데이터 상호 작용을 분석해 보겠습니다.
터미널과 셸은 두 가지 서비스로 간주되며 데이터 상호 작용, 데이터 전송 시 인코딩, 데이터 수신 시 디코딩이 필요합니다. 인코딩 체계와 디코딩 체계가 일치하지 않으면 깨짐 또는 실패가 발생할 수 있습니다. 즉, 터미널에 중국어 명령을 입력할 때 예외가 표시되고 실행 결과가 예상과 일치하지 않습니다.
Ssh 를 사용하여 원격 셸에 로그인하는 경우 원격 셸의 인코딩 구성은 로컬 셸과 일치합니다. 이제 ssh -v V 를 통해 ssh 를 인쇄할 수 있습니다.
그래서 우리의 첫 번째 요점은
Vim 에는 네 가지 인코딩 관련 설정이 있습니다.
Vim 의 인코딩 설정이 상당히 복잡하다는 것을 알 수 있습니다. 따라서 이러한 인코딩 설정의 기능을 분석하기 위해 구체적인 예를 계속 사용합니다.
로컬 vim 을 켜든 원격 vim 을 켜든, 먼저 로컬 셸의 인코딩 설정이 터미널과 일치하는지 확인해야 인코딩 및 디코딩과 관련된 데이터 스트림을 다음과 같이 단순화할 수 있습니다
Vim 은 파일을 열고 결국 터미널에 표시합니다. 이 프로세스는 인코딩 설정과 관련이 있습니다.
Vim 은 파일을 열고 표시하는 동안 많은 인코딩 변환 작업을 수행하는 것을 볼 수 있습니다. 바이너리를 인코딩 a 에서 인코딩 b 로 변환하는 단계는 다음과 같습니다
최종 출력은 여전히 바이트 스트림입니다. A 와 B 가 다를 경우 출력 바이트 스트림은 입력 바이트 스트림과 다릅니다 (모든 인코딩 체계의 ascii 문자에 대해 동일한 ascii 바이트 스트림 제외). 변환이 성공하려면 decode 가 사용하는 인코딩 체계가 입력 바이트 스트림의 인코딩 체계와 일치해야 합니다. 즉, 입력 바이트 스트림이 C 인코딩 체계로 생성된 경우 A 인코딩 체계로 디코딩하면 실패합니다.
Vim 의 일부 인코딩 항목이 설정되지 않은 경우 해당 종속성의 설정이나 기본 설정이 사용됩니다. 종속성은 다음과 같습니다.
Vim 의 이러한 인코딩 설정에서는 일반적으로 파일 인코딩과 인코딩만 설정합니다. 중국어와 영어 환경에서만 사용할 경우 다음과 같이 설정할 수 있습니다.
인코딩은 utf8 로 설정해야 합니다. utf8 은 모든 문자를 나타낼 수 있기 때문입니다.
터미널 인코딩이 gbk 로 설정되어 있고 vim 인코딩이 utf8 이라고 가정합니다. 이 시점에서 파일을 열면 utf8 또는 gbk 인코딩인지 여부에 관계없이 파일이 제대로 표시되지 않습니다.
앞서 언급했듯이 vim 의 $ termencoding 은 기본적으로 인코딩 설정을 상속하며 파일을 여는 해당 단계는 다음과 같습니다.
제대로 표시하려면 vim 의 $ termencoding 코드를 임시로 수정하여 터미널 인코딩 코드와 일치시키면 됩니다. $ termencoding 은 표시만 포함하며 파일 내용의 변경은 포함하지 않습니다. 인코딩 항목을 수정하지 마십시오. 정확히 말하자면, 언제든지 인코딩 설정을 수정하려고 하지 마라.
그래서 우리의 두 번째 요점은
열린 파일의 데이터 흐름이 vim 에서 터미널로 이어지는 경우 파일 수정은 터미널에서 vim, 터미널로 왕복하는 프로세스입니다.
인코딩과 관련된 단계는 다음과 같습니다. 앞서 파일 디스플레이를 여는 과정에 대해 설명했습니다. 여기서는 수정 및 저장 프로세스만 언급합니다.
파일 인코딩에는 두 가지 경우가 있습니다.
위에서 볼 수 있듯이 인코딩 체계에 의해 인코딩된 데이터는 vim 의 중간 지점입니다. 파일에서 읽거나 터미널에서 가져온 데이터를 수신할 때 인코딩 체계로 변환한 다음 파일을 저장할 때 인코딩 체계를 fileencoding 체계로 변환해야 합니다. 따라서 인코딩은 모든 문자를 나타내는 인코딩 체계로 설정해야 하며, 일반적으로 utf8 로 설정해야 합니다.
터미널과 셸의 인코딩 설정이 모두 gbk 이고 vim 의 인코딩 설정이 utf8 이라고 가정하면 문자를 정상적으로 입력하고 표시하려면 $ termencoding 설정을 터미널 인코딩과 일치하도록 설정해야 합니다. 즉, 문자 표시와 입력 문자가 있는 파일 저장이 모두 제대로 작동합니다.
우리는 단지 코딩의 영향을 보여주기 위해 코딩 불일치를 설정할 수 있다. 실제 환경에서는 이러한 인코딩 설정이 일치하는지 확인해야 하므로 최종 요점은 다음과 같습니다