vi 의 encoding, fileencoding, fileencodings 옵션에 대해...

raymundo의 이미지

vim의 encoding, fileencoding, fileencodings 가 좀 애매해서요 문의드립니다.

1.

:help 로 읽어보니 제가 제대로 파악했다면

1) encoding 은 화면에 보이는 것, 시스템이나 터미널에 관련되어 있지 파일 자체에는 관계 없다
2) fileencoding 은 파일에 저장되는 코드, encoding 과 fileencoding 이 같으면 (보통 euc-kr 이나 cp949?) 상관없고 이 둘이 다르면 파일을 읽거나 쓸 때 변환이 된다.
3) fileencodings 에는 여러 인코딩 룰을 적어주면 파일을 읽을 때 하나씩 검사해서 맞는 인코딩을 찾아내어 자동으로 fileencoding 을 세팅해준다.

(여기까지 맞다 틀리다 지적해주시면 감사하겠습니다)

2.

일단 1.이 제가 제대로 이해한 거라면... 윈도우의 메모장에서 한글 텍스트 문서를 작성하고 "다른 이름으로 저장"에서 "인코딩"을 UTF-8로 해서 저장하는 경우를 vi 로 동일하게 하려면, 파일을 편집한 후 :set fileencoding=utf-8 로 지정하고 :write 를 하면 되겠죠?

(여기까지 맞다 틀리다 지적해주시면 감사하겠습니다)

3.

근데 제가 리눅스 (레드햇인데 정확한 버전은 모르겠습니다. 서버 호스팅 계정이라..) 에서 다음과 같이 해 보았습니다.

1) test.txt 는 그냥 평범하게 한글 몇 글자 적고 저장
2) test2.txt 는 2.의 내용처럼 set fileencoding=utf-8 로 한 후 저장
3) ~/.vimrc 에 set fileencodings=utf-8,korea 로 지정

이제 각 파일을 불러 보면 (vi test.txt) euc-kr 로 저장된 test.txt 는 그냥 열리고, utf-8로 저장된 test2.txt 는 "변환되었습니다"라는 메시지가 아래 뜨면서 열리는군요. set 으로 확인해보면 fileencoding=utf-8 로 자동으로 되어 있고요. 이건 예상했던 결과인데...

그런데 반대로,
set fileencodings=korea,utf-8 로 지정을 하면 그런 메시지도 없고 열린 문서도 보면 깨져 있습니다. :set 으로 확인하면 fileencoding=euc-kr 로 되어 있고요.

fileencodings 옵션에 적는 순서는 멀티바이트, 그 중에서도 한 글자가 3바이트 이상 될 수 있는 유니코드 쪽을 먼저 적어주고 2바이트, 1바이트 인코딩 순으로 적어줘야 하는 건가요? korea,utf-8 순으로 적을 경우, utf-8 문서를 읽었는데 처음 두 글자를 봤을 때 그게 euc-kr 에 있는 코드라서 euc-kr 이라 판단해 버리는 경우가 생기기 때문에 위와 같은 결과가 발생한 걸까요? 추측은 되는데 확실치 않아서 여쭙니다.

4.

이번에는 윈도2000에서 gvim 으로 같은 일을 해 보려고 했는데, utf-8 문서를 만들 수가 없네요. 3.의 과정과 같이 fileencoding=utf-8 로 지정한 후 :w 를 하면
"변환할 수 없습니다!"라는 메시지가 뜨면서 저장이 안 됩니다.

이유가 뭘까요?

5.

4.에서 실패해서, 할 수 없이 메모장으로 텍스트파일을 만들어 utf-8로 저장했습니다. 이것을 gvim 으로 읽었습니다만, fileencodings=utf-8,korea 로 지정했음에도 변환도 되지 않고 그냥 깨져서 나옵니다. fileencoding=cp949로 설정되어 있네요.
이 상태에서 :set fileencoding=utf-8 해 봐도 변화가 없네요. (파일을 여는 게 아니니 당연한지도) :set encoding=utf-8 하면 한글이 나오기는 하는데 제일 처음에 <feff> 라는 표시가 붙습니다. 원래 "동해물과"라는 거였는데 화면에는 "<feff>동해물과"라고 나오네요. 이것도 왜 그런지 모르겠습니다.

4.와 5.에서 자동 변환이 안 되는 이유가 뭘까요, 혹시 vim 자체적으로 하는 게 아니라 iconv 등의 외부 유틸이 필요한가요? 윈도우용 iconv 가 따로 있는지요?

도움 주시면 감사하겠습니다. 모두들 새해 복 많이 받으세요!

이광우의 이미지

fileencodings 의 경우에는 ucs-bom, utf-8, euc-kr, latin1 순으로 해야 인식이 된다고 help 파일에 적혀 있군요.

vim 내에 3개의 문자 인코딩 그룹이 있습니다.
그 중에 utf-8은 Unicode 그룹에 들어가서
2바이트 문자 인코딩 그룹에 들어가 있는 euc-kr, cp949 등은
그 뒤에 나와야 되는 것으로 생각됩니다.
8비트 문자 인코딩은 fileencodings에 제일 나중에 나와야 한다고
명시되어 있네요.

Be Creative For Fun!!

랜덤여신의 이미지

1,2,3 번 모두 맞는 것 같습니다. (일단 제가 알고 있는 한은요... :))

4,5번의 경우, 윈도우용 gvim 에서 인코딩 변한 기능을 쓰기 위해서는 윈도우용 iconv 라이브러리 를 vim.org 에서 받아서 vim 이 설치된 디렉토리에 넣어주셔야 합니다.

ps: fileencoding == fenc 이고 fileencodings == fencs 니까 짧게 줄여서 사용하세요~
ps2: 보통 encoding 값은 자동으로 정해지므로 따로 설정하지 않아도 됩니다.

raymundo의 이미지

답변 주셔서 감사합니다. 1,2,3번은 제가 제대로 이해한 거네요. 4,5의 경우 두어 가지 더 여쭈겠습니다.

인클루드 wrote:

4,5번의 경우, 윈도우용 gvim 에서 인코딩 변한 기능을 쓰기 위해서는 윈도우용 iconv 라이브러리 를 vim.org 에서 받아서 vim 이 설치된 디렉토리에 넣어주셔야 합니다.

1) 저기... "libiconv-1.9.1.bin.woe32"와 "libiconv-1.9-w32.2.bin.woe32"의 차이가 뭔가요? 번갈아 해 보면 둘 다 잘 되는 것 같습니다만...

2) 받아보니 유닉스 환경에 쓰도록 share, lib, include 등등의 트리구조가 다 있던데, 윈도에서 쓸 때는 iconv.dll 하나만 gvim.exe 가 있는 곳에 넣으면 충분한 건가요? 이것도 해 보니 잘 되는 것 같긴 한데 불안해서..

3) 현재 제 _vimrc 파일에는
:set fenc=korea
:set fencs=ubs-bom,utf-8,korea
위와 같이 설정되어 있습니다. 이 상태에서 윈도우 탐색기를 띄워서 특정 폴더에서 마우스 오른쪽 버튼으로 "새로만들기-텍스트문서"를 하여 0byte 짜리 텍스트파일을 먼저 만든 후에 이것을 gvim 으로 열었더니 자동으로 fenc=utf-8 로 되어 버리네요. 빈 txt파일이나, 영문만 있는 txt파일의 경우 이렇게 되어서 별 생각없이 한글을 입력하고 저장하면 UTF-8 이 되어 버리겠습니다. 이 경우 fenc=korea 가 되게 하려면 어떻게 해야 될까요?

그리고 이것은 여담입니다만... 이제는 텍스트파일을 만들때도 utf-8 로 만드는 게 더 나은 선택일까요? 구글데스크탑서치의 경우 오피스파일은 검색은 잘 하는데 텍스트는 왜 검색을 못하나 했더니만 utf-8로 저장한 텍스트는 검색 잘 하더군요.

번거롭게 자꾸 질문 올려서 죄송합니다. 조언 부탁드리겠습니다. 좋은 하루 되세요!

좋은 하루 되세요!

wafe의 이미지

2) iconv.dll만 있으면 잘 됩니다. 다른 건 라이브러리를 이용해서 다른 걸 개발할 때 필요한 파일들이겠죠.

3) 이건 저도 해결책은 못 찾은 건데, 저는 텍스트 파일은 utf-8로 저장하는 게 좋다고 생각하기 때문에 고맙게 잘 쓰고 있습니다. :)

그리고 구글 데스크탑 한글판이 나오면서부터 cp949 텍스트 파일도 잘 검색해주고 있네요.

Heejoon Lee

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.