Windows에서 UTF-8사용방법?

jic5760의 이미지

//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을 사용할 수 있게 하고 싶습니다.

kukyakya의 이미지

현재 locale로 변환을 하신 후에 출력하시면 됩니다. iconv 등을 사용하시면 되는데, 현재 locale을 알아내어 변환하는 것이 system independent하게 구현하기가 쉽지는 않습니다.

C++11 표준에 제공되는 std::codecvt_utf8을 사용하면 utf8 문자열을 wchar_t 문자열로 변환한 후 wcout이나 wprintf로 출력할 수 있는데, gcc에선 아직 구현이 되지 않은 걸로 알고 있습니다.

이런 저런 부가적인 작업이 귀찮으실 경우 boost::locale 사용을 추천드립니다.

jic5760의 이미지

최대한 다른 라이브러리를 사용하지 않고 싶어서 boost는 어려울거 같네요...
std::codecvt_utf8에 대해 알아보겠습니다.
답변 감사합니다~

empty2fill의 이미지

안녕하세요.

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 문자 출력을 위한 테스트 코드는 아래와 같습니다.

#include <stdio.h>
 
#include <Windows.h>
 
// 윈도우즈 커맨드 창의 글꼴 설정을 Lucida Console 또는 굴림체로 변경해 주세요.
int main(int argc, char* argv[])
{
	UINT oldcodepage = GetConsoleOutputCP();
	SetConsoleOutputCP(65001); // UTF-8 Codepage 
 
	char hangulText[] = "한글";
 
	char hangulUtf8[] = {0xed, 0x95, 0x9c, 0xea, 0xb8, 0x80, 0}; // "한글"의 UTF-8 인코딩
 
	printf("hangulText : %s \n", hangulText);
	printf("hangulUtf8 : %s \n", hangulUtf8);
 
	SetConsoleOutputCP(oldcodepage);
 
	return 0;
}

출력 결과, Windows 7, Visual Studio 2012

hangulText : �ѱ�
hangulUtf8 : 한글
Press any key to continue . . .

소스 코드에 직접 "한글" 문자열을 하드 코딩한 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 -

jic5760의 이미지

UTF8을 하드코딩하는 방법을 알고싶었는데 결국 Windows에서는 힘들겠군요...
답변 감사합니다.
변환 코드를 사용해야 되겠네요~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.