Windows에서 UTF-8사용방법?
글쓴이: jic5760 / 작성시간: 수, 2014/10/22 - 10:55오후
//locale : ko_KR.UTF-8 int main(){ char str[]="가"; char str2[4] = {0xea, 0xb0, 0x80, 0}; printf("%02x %02x %02x\r\n", (unsigned char)str[0], (unsigned char)str[1], (unsigned char)str[2]); printf("%s\r\n", str2); return 0; }
이런 소스를 짜서 리눅스머신에서 실행을 해 보면
ea b0 80 가
이런 결과를 얻게 됩니다.
UTF-8으로 작동합니다.
하지만 이 소스를 윈도우에서 작동시키면 이상한 글자가 나옵니다.
아무래도 윈도우에서는 UTF-8을 사용하지 않아서 그러는 것 같은데
어떤 컴파일 옵션을 설정해야 하나요?
윈도우나 리눅스나 상관없이 컴파일해도 UTF-8을 사용할 수 있게 하고 싶습니다.
Forums:
현재 locale로 변환을 하신 후에 출력하시면
현재 locale로 변환을 하신 후에 출력하시면 됩니다. iconv 등을 사용하시면 되는데, 현재 locale을 알아내어 변환하는 것이 system independent하게 구현하기가 쉽지는 않습니다.
C++11 표준에 제공되는 std::codecvt_utf8을 사용하면 utf8 문자열을 wchar_t 문자열로 변환한 후 wcout이나 wprintf로 출력할 수 있는데, gcc에선 아직 구현이 되지 않은 걸로 알고 있습니다.
이런 저런 부가적인 작업이 귀찮으실 경우 boost::locale 사용을 추천드립니다.
답변감사합니다.
최대한 다른 라이브러리를 사용하지 않고 싶어서 boost는 어려울거 같네요...
std::codecvt_utf8에 대해 알아보겠습니다.
답변 감사합니다~
UTF-8 문자 출력에 영향을 주는 것들
안녕하세요.
UTF-8로 인코딩된 문자를 출력하기 위해서는 아래 조건을 확인해야 하는데요.
1) 시스템 언어(locale) 설정
시스템의 언어 설정이 프로그램에서 사용하는 언어 설정과 일치하는지 확인해 보세요.
2) 컴파일러 + 소스 코드 인코딩
소스 코드에 직접 UTF-8 문자를 하드 코딩해서 사용하는 경우에 소스 코드가 UTF-8로 저장되어야 하고 컴파일러가 UTF-8 문자열을 지원해야 합니다.
3) 터미널 또는 콘솔의 글꼴 설정
터미널 또는 콘솔에서 사용하는 글꼴이 유니코드를 지원해야 합니다.
리눅스에서는 기본적으로 위 삼박자가 잘 맞아 별 어려움 없이 UTF-8을 사용할 수 있는데요.
윈도우즈에서는 왜 어려울 까요?
1) 시스템 언어(locale) 설정 문제
윈도우즈의 시스템 언어는 운영체제 설치 언어를 따라갑니다. 한글 윈도우즈의 경우 Korean - Codepage 949를 기본으로 사용 합니다. UTF-8을 사용하기 위해서는 코드 페이지를 UTF-8 65001로 변경해야 합니다.
(커맨드 창에서 chcp 명령어 또는 SetConsoleOutputCP 함수 사용)
2) 컴파일러 + 소스 코드 인코딩 문제
많이 사용하는 Visual Studio C++의 경우 아직 UTF-8 문자열(참조1)을 지원하지 않는 것으로 알고 있습니다. 그래서 소스 코드에 직접 하드 코딩해서 UTF-8 문자를 사용할 수 없습니다.
또 기본적으로 소스 코드를 Korean - Codepage 949로 저장해서 리눅스에서 사용시 인코딩을 변경해 주어야 합니다.
참조1
http://en.wikipedia.org/wiki/C++11#New_string_literals
3) 터미널 또는 콘솔의 글꼴 설정 문제
윈도우즈 커맨드 창의 기본 글꼴이 래스터 글꼴로 되어 있는데 Unicode를 지원하는 Lucida Console 또는 굴림체로 변경해야 합니다.
UTF-8 문자 출력을 위한 테스트 코드는 아래와 같습니다.
출력 결과, Windows 7, Visual Studio 2012
소스 코드에 직접 "한글" 문자열을 하드 코딩한 hangulText 는 제대로 출력되지 않는 것을 볼 수 있습니다.
운영체제(플랫폼)에 상관 없이 유니코드(UTF-8/UTF-16)을 사용하기 위해서는 여러 방법이 있겠지만,
프로그램 내부에서 사용하는 문자열은 항상 유니코드로 저장/처리하고
외부에 출력할 경우에만 UTF-16 또는 해당 codepage로 변환해서 출력하는 방법을 생각해보세요.
더 읽어 볼 것들
http://illegalargumentexception.blogspot.kr/2009/04/i18n-unicode-at-windows-command-prompt.html
http://alfps.wordpress.com/2011/11/22/unicode-part-1-windows-console-io-approaches/
http://alfps.wordpress.com/2011/12/08/unicode-part-2-utf-8-stream-mode/
——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -
답변 감사합니다.
UTF8을 하드코딩하는 방법을 알고싶었는데 결국 Windows에서는 힘들겠군요...
답변 감사합니다.
변환 코드를 사용해야 되겠네요~
댓글 달기