Vim에서 인코딩 변경하여 저장하기

vim7.2를 사용중입니다.

UTF-16 Big Endian으로 저장된 문서(한글)가 하나 있습니다.

이걸 그냥 vim으로 열어보면 글씨(한글)가 모두 깨져서 나옵니다.
(영어 부분은 잘 보입니다.)

그래서 아래와 같은 옵션을 줬습니다.

[code:la1lxnxd]:set enc=utf-8[/code:la1lxnxd]

이제 정상적으로 문서가 보이는군요. 그리고 문서 가장 처음에

[code:la1lxnxd]<feff>[/code:la1lxnxd]
와 같이 UTF-16 Big Endian를 의미하는 해더가 붙어있는 것을 볼 수 있습니다.

그럼 여기서 질문입니다.

지금 제가 보고 있는 이 문서를 UTF-8로 저장하고 싶습니다.

[code:la1lxnxd]:w document.txt[/code:la1lxnxd]
와 같이 명령을 내리면 아래와 같은 에러가 나는군요.

[code:la1lxnxd]"document.txt" E513: write error, conversion failed (make ‘fenc’ empty to override)
미안러ㅣㅁㄴ어리
말어ㅣㅁ넝ㄹㅁㅇㄻ
마어리ㅏㅁ러[/code:la1lxnxd](아래 3줄은 한글로 메세지가 나오는데 글씨가 깨져서 알아볼수 없었습니다.)

도움을 부탁드립니다.

감사합니다.

아래처럼 하면 변환되어야 할 것 같은데, 반응이 없네요… 음… 도움말을 좀 더 찾아봐야겠어요.

[code:la1lxnxd]:set ccv="utf-8"
or
:w ++enc=utf-8 document.txt[/code:la1lxnxd]

[code:2yngk5eq]set fencs=ucs-bom,utf-8,utf-16,cp949,euc-jp,latin1[/code:2yngk5eq]와 같은 설정을 .vimrc 에 두고
파일을 읽으면 utf-16 문서가 제대로 읽히고 이걸[code:2yngk5eq]:set fenc=utf-8
:w aaa.txt[/code:2yngk5eq]하면 aaa.txt에 uft-8로 쓰여지네요.

.vimrc를 수정하지 않고는 잘 모르겠는데[code:2yngk5eq]:set fencs=utf-16
:e
:set fenc=utf-8
:w aaa.txt[/code:2yngk5eq]하면 되긴 합니다.

seungje 님 글의 변경된 내용을 보고
무작정 시도해 보니 이런 것도 되는군요.

[code:2yngk5eq]:e ++enc=utf-16
:w ++enc=utf-8 aaa.txt[/code:2yngk5eq]

저와는 조금 다르군요. :cry:

[quote="esrevinu":3b8q9y8y][code:3b8q9y8y]set fencs=ucs-bom,utf-8,utf-16,cp949,euc-jp,latin1[/code:3b8q9y8y]와 같은 설정을 .vimrc 에 두고
파일을 읽으면 utf-16 문서가 제대로 읽히고 이걸[code:3b8q9y8y]:set fenc=utf-8
:w aaa.txt[/code:3b8q9y8y]하면 aaa.txt에 uft-8로 쓰여지네요.[/quote:3b8q9y8y]저는 이렇게 해도 정상적으로 읽히지 않습니다. 또한 저장을 할 때 에러메세지가 나옵니다.

[code:3b8q9y8y]"Document.txt" E513: write error, conversion failed (make ‘fenc’ empty to override)
경고: 원래 파일이없어졌거나 깨졌을 수 있습니다.
파일이 성공적으로 저장될 때까지 편집기를 끝내지 마십시오!
Press ENTER or type command to continue[/code:3b8q9y8y]

그리고 아래와 같은 메세지 창이 뜹니다.

[code:3b8q9y8y]W12: 경고: 파일 "Document.txt"이(가) 바뀌었고 마찬가지로 빔의 버퍼도 바뀌었습니다
See ":help W12" for more info.
확인(O), 파일 불러오기(L)[/code:3b8q9y8y]
여기서 확인을 누르면, 여전히 글자가 깨진 상태를 유지하게 되며,
파일 불러오기를 누르면, 한글이 정상적으로 보이는 화면이 됩니다.

또한 위의 저장 명령으로 생성된 파일은 그냥 빈 파일입니다.

그냥 불러오기 할 때,

[code:1ymkp1tm]:e ++enc=ucs-bom 파일명[/code:1ymkp1tm]
이렇게 하면 제대로 보이는군요.

그리고, 이걸 저장할 때,

[code:1ymkp1tm]:w ++enc=utf-8 파일명[/code:1ymkp1tm]
이렇게 하니, 저장도 됬습니다.

음…

감사합니다.

UTF-8 인코딩에서의 BOM(Byte Order Mark) 문제였던가요…

전에 저도 BOM 관련한 문제를 겪어서 좀 당황했었는데, 이게 Windows가 UTF-8 텍스트 문서에 유닉스/리눅스에서는 사용하지 않는 BOM을 끼워 넣어서 생기는 문제더군요.;

같은 경우인지는 모르겠습니다만 해결 방법에 BOM이 들어가 있어서 댓글 달아 봅니다.

저는 웹에서 BOM을 자동으로 제거해 주는 펄 스크립트를 구해서 쓰고 있습니다.

BOM에 관해서는 아래 문서를 참고 하세요.

http://blog.wystan.net/2007/08/18/bom-b ... rk-problem

다음은 제가 사용하고 있는 BOM 제거 펄 스크립트입니다.

[code:35ynjj1i]#!/usr/bin/perl -pi~ -0777

program to remove a leading [UTF-8] BOM from a file

works both STDIN -> STDOUT and on the spot (with filename as argument)

if ($] > 5.007) {
require Encode;
Encode::utf8_off($);
}
s/^\xEF\xBB\xBF//s;[/code:35ynjj1i]

혹시나 해서 댓글 답니다. :)

[quote="pcandme":3n3yoq6o]혹시나 해서 댓글 답니다. :)[/quote:3n3yoq6o]
감사합니다.

사실 처음 증상을 보고 BOM 때문에 그렇가 생각했었는데, 문제가 된 문서의 UTF-16은 기본적으로 BOM을 가지고 있어야 하는 것이 맞습니다.
UTF-16 이니깐요… <FEFF> 더군요.
왜 문서가 이렇게 저장되었는지는 의문입니다만, 덕분에 가물가물했던 인코딩과 BOM등등을 다시 찾아보는 기회가 되었네요. :shock: