윈도 비주얼 c/c++ 개발자분들이 말하는 '유니코드로 개발하기'란 대체 무엇인가요?

hwayak의 이미지

웹을 돌아다니다보면, 윈도 비주얼 c/c++ 개발자분들이 항상 mbcs를 버리고, 유니코드로 개발해야 한다라고 하는 걸 가끔 볼때가 있는데요.

오랫동안 unix-like 시스템 개발을 한 저로써는 쉽게 이해가 가지 않는 내용들인데요..
저는 항상 개발을 할때는 ascii로만 작업하고, 가끔 국제화/지역화를 위해서는 gettext를 사용합니다. 이렇게 하면 굳이 코드내에서 ascii 문자이외의 문자를 적을 필요가 없어지니까 말이죠.

http://www.gpgstudy.com/forum/viewtopic.php?p=122307

위 링크를 보면 유니코드로 개발하면 '외국어 윈도우에서도 한글이 깨지지 않고 잘 표현된다', '다국어 버전을 만들기 쉬워진다.' 등의 장점을 얘기하고 있는 것을 볼 수 있는데요.

'외국어 윈도우에서도 한글이 깨지지 않고 잘 표현된다'의 경우.... 만약 어떤 프로그램이 있고, 그 프로그램에서 사용하는 모든 문자열이 mbcs 방식, 예를 들어 euc-kr로 처리하게끔 컴파일되어져 있다면, 그 프로그램이 실행되는 윈도우의 로케일이 euc-kr를 처리할 수 있는 로케일이라면(예를 들어, ko_KR.euckr), 글자가 올바로 나올 것이고(물론 폰트가 올바로 설치되어 있다면 말이죠), 그렇지 않으면 글자가 깨질 거라고 생각하는데요.
굳이 프로그램 자체에서 모든 문자열 처리를 유니코드로 처리한다고 해서, 그 프로그램을 임의의 윈도우에서 수행시켜도 한글이 올바로 나온다라고 보장할 수 있나요? 만약 윈도우의 로케일을 ko_KR.euckr로 설정해놓고, 유니코드로 개발된 프로그램을 수행시킨다면 그 역시 문자는 깨져서 나와야 하는게 아닌가 싶어서요. 로케일을 ko_KR.utf8, ko_KR.utf16 등등 유니코드를 올바로 처리해줄 수 있는 로케일로 설정이 되어 있어야 문자가 깨지지 않고 나올 수 있는게 아닌가 싶어서요.

윈도우에서는 unix-like 운영체제에서 처럼 ko_KR.euckr 과 같은 방식으로 로케일을 설정하는게 아닌 것으로 알고 있습니다만... 그냥 예를 들기 위해서 이와 같이 말해본 것입니다. 양해 부탁드려요 ^^.

그리고 '다국어 버전을 만들기 쉬워진다'라고 적혀 있는데.. 이건 또 무슨 말인지... 왜 유니코드로 개발한다고 해서 다국어 버전을 만들기 쉬워지는지 이해가 쉽게 안 가네요.

아 어쨌든 제가 윈도우의 로케일 시스템에 대해서 잘 모르기 때문에 이해를 하지 못하는 것이라는 생각이 깊게 드는데... 혹시 이해되게끔 설명해 주실 분 계신가요?

winner의 이미지

1차적으로 배포하기 좋다는 것은 아니겠죠.

Unicode encoding에 따라 다르겠지만 일반적으로 memory에서는 UCS-2 나 UCS-4를 써서 고정길이 wide character로 하잖아요.
우선 programming이 쉬워지죠. 하지만 기존과 다른 방식을 써야 하기 때문에 호환성도 생각해야 하고, 양자간의
차이를 이해할 필요도 있기는 합니다.

또하나는 Unicode로 세상이 통일되면 배포도 쉬워지겠죠.

언제나 장점이 있으면 그에 따른 단점도 있기 마련입니다. 위의 장점들은 기본가정이 이루어져야 한다는데에서
단점을 가지고 있죠.

그런데 이제는 가장 중요한 이유가 인터넷을 통해 세상이 하나가 되고 있고, 동시에 다른 locale의 문자를 표현할 필요가
있기 때문에 unicode는 매우 중요하다고 봅니다.

sixmen의 이미지

굳이 프로그램 자체에서 모든 문자열 처리를 유니코드로 처리한다고 해서, 그 프로그램을 임의의 윈도우에서 수행시켜도 한글이 올바로 나온다라고 보장할 수 있나요?

이부분이 yes입니다.

MBCS로 하면 프로그램에 euc-kr로 들어가 있기 때문에 locale이 다른 환경에서 그 프로그램을 읽으면 잘못된 글자로 판단하겠죠.
하지만 유니코드로 프로그램에 넣으면 locale을 무시하고 해석을 하게 됩니다.

unix쪽에는 유니코드를 받아들이는 API가 잘 없어서 느낌이 안 오시는 듯 한데, 윈도우는 문자열을 받아들이는 대부분의 API가 두 종류씩 존재합니다. CreateWindowA, CreateWindowW와 같이요. 앞의 것은 MBCS를 받고 뒤의 것을 유니코드를 받게 됩니다.

unix에서 유니코드 프로그래밍을 잘 안 해봐서 확신은 안 가는데, wchar_t와 L"foo"를 쓰면 아마 unix에서도 locale의 영향을 받지 않는 프로그램을 짤 수 있지 않을까 싶네요.

윈도우에서는 무조건 locale이 *.utf16이라고 생각하시는 것도 괜찮을 듯 하네요.(non unicode 프로그램이 들어오면 ko_KR인 것을 보고 euc-kr -> utf16 작업을 하고요)

hwayak의 이미지

Quote:

윈도우에서는 무조건 locale이 *.utf16이라고 생각하시는 것도 괜찮을 듯 하네요.(non unicode 프로그램이 들어오면 ko_KR인 것을 보고 euc-kr -> utf16 작업을 하고요)

말씀해주신대로 만약 윈도우의 로케일이 정말 *.utf16이라면, 위에서 제가 궁금했던 것이 해결됩니다.

그런데 제가 알고 있기론 한글 윈도우에선 cp949라 불리는(euc-kr을 확장한 것으로 알고 있습니다만..)걸 사용한다고 알고 있긴 합니다만..
근데 정말 윈도우에서는 로케일 설정을 어떻게 확인하나요? 그리고 어떻게 변경할 수 있나요?

unix-like 시스템에 익숙해져있다보니 윈도의 로케일 시스템에 대해서 전혀 알 수가 없어 답답하네요. 검색을 해봐도 명쾌한 글은 보이지 않네요.

winner의 이미지

사실 locale이 가장 중요한 것은 입출력인데 이것은 사실 UTF-16이 기본이라고 말하기는 힘듭니다. Memory에서 활용되는 library가 그렇다는 것이지요.

사실 Windows는 하나의 거대한 객체 system이니 UTF-16이 오고가는 것은 좋은데
cmd.exe는 여전히 bytestream system이라 unicode 쓰기가 난감합니다.
질문이 나와서 좀 찾아봤는데 제가 원하는 것까지는 안 나오더군요.

Necromancer의 이미지

유니코드 받아들이는 API가 없다 -> utf8 인코딩으로 대응하고 있습니다. 이거 쓰면 기존 표준 라이브러리들 그대로 쓸 수 있습니다.
그리고 윈도 API중 뒤에 W자 들어가는거는 utf16문자열을 처리합니다. 윈도에서 utf8은 찬밥신세.

VC++ 프로젝트옵션 뒤져보면 유니코드로 할건지 MBCS로 할건지 결정하는 옵션 있는데, 유니코드면 utf16, MBCS면 해당 윈도 언어의 문자셋을 씁니다. (제 기억으로는 vs 2003이나 vs2005에서 봤는데 6.0은 잘 모르겠네요. 이후버전에도 있습니다)
그리고 프로그램 내의 문자열이라면, vc++은 소스코드에 하드코딩한 문자열을 특정 인코딩으로 들어가도록 하는 매크로들이 있습니다. _T()나 _L() 등등. _L("가나다라") 라고 쓰면 컴파일할때 "가나다라"라는 문장이 utf16 인코딩으로 들어 갑니다. 뒤에 W로 끝나는 함수에서 그대로 갖다 쓸 수 있고요.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

winner의 이미지

요새 회사에서 VS 만 쓰다보니 알게 되었습니다.
L은 C++ 표준에도 있는 것으로 wide character를 위한 것이죠.
아마 long 내지는 large의 약자일 것 같습니다.
L'a', L"abc" 이렇게 씁니다.

sixmen의 이미지

말을 좀 애매하게 썼는데 윈도우즈 API는 유니코드만 받아들이는데, 유닉스쪽은 locale이 *.utf-8로 설정되어 있을 때 문자열을 utf-8로 해석하는거지, 인코딩이 고정되어 있지 않다 라는 의미로 써봤습니다.

utf-8로 하면 기존 프로그램 호환되는 건 좋은데, 글자 하나가 차지하는 바이트 수가 제각각이다 보니까, 문자열을 다루기가 까다롭더라고요..

dg의 이미지

삭제

madman93의 이미지

느낌이 팍팍 오실것 같습니다.
분명한건 위에 글들처럼 unicode로 개발 하는것과 아닌것의 차이가 있습니다.
적어도 windows 상에서는 말이죠
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

댓글 달기

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