윈도 비주얼 c/c++ 개발자분들이 말하는 '유니코드로 개발하기'란 대체 무엇인가요?
웹을 돌아다니다보면, 윈도 비주얼 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 과 같은 방식으로 로케일을 설정하는게 아닌 것으로 알고 있습니다만... 그냥 예를 들기 위해서 이와 같이 말해본 것입니다. 양해 부탁드려요 ^^.
그리고 '다국어 버전을 만들기 쉬워진다'라고 적혀 있는데.. 이건 또 무슨 말인지... 왜 유니코드로 개발한다고 해서 다국어 버전을 만들기 쉬워지는지 이해가 쉽게 안 가네요.
아 어쨌든 제가 윈도우의 로케일 시스템에 대해서 잘 모르기 때문에 이해를 하지 못하는 것이라는 생각이 깊게 드는데... 혹시 이해되게끔 설명해 주실 분 계신가요?
Programming 하기 편해진다는 뜻...
1차적으로 배포하기 좋다는 것은 아니겠죠.
Unicode encoding에 따라 다르겠지만 일반적으로 memory에서는 UCS-2 나 UCS-4를 써서 고정길이 wide character로 하잖아요.
우선 programming이 쉬워지죠. 하지만 기존과 다른 방식을 써야 하기 때문에 호환성도 생각해야 하고, 양자간의
차이를 이해할 필요도 있기는 합니다.
또하나는 Unicode로 세상이 통일되면 배포도 쉬워지겠죠.
언제나 장점이 있으면 그에 따른 단점도 있기 마련입니다. 위의 장점들은 기본가정이 이루어져야 한다는데에서
단점을 가지고 있죠.
그런데 이제는 가장 중요한 이유가 인터넷을 통해 세상이 하나가 되고 있고, 동시에 다른 locale의 문자를 표현할 필요가
있기 때문에 unicode는 매우 중요하다고 봅니다.
locale에 영향을 받지 않는다는 뜻입니다.
이부분이 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 작업을 하고요)
인용: 윈도우에서는
말씀해주신대로 만약 윈도우의 로케일이 정말 *.utf16이라면, 위에서 제가 궁금했던 것이 해결됩니다.
그런데 제가 알고 있기론 한글 윈도우에선 cp949라 불리는(euc-kr을 확장한 것으로 알고 있습니다만..)걸 사용한다고 알고 있긴 합니다만..
근데 정말 윈도우에서는 로케일 설정을 어떻게 확인하나요? 그리고 어떻게 변경할 수 있나요?
unix-like 시스템에 익숙해져있다보니 윈도의 로케일 시스템에 대해서 전혀 알 수가 없어 답답하네요. 검색을 해봐도 명쾌한 글은 보이지 않네요.
국가 및 언어 설정
사실 locale이 가장 중요한 것은 입출력인데 이것은 사실 UTF-16이 기본이라고 말하기는 힘듭니다. Memory에서 활용되는 library가 그렇다는 것이지요.
사실 Windows는 하나의 거대한 객체 system이니 UTF-16이 오고가는 것은 좋은데
cmd.exe는 여전히 bytestream system이라 unicode 쓰기가 난감합니다.
질문이 나와서 좀 찾아봤는데 제가 원하는 것까지는 안 나오더군요.
유니코드 받아들이는
유니코드 받아들이는 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
.NET은 기본 파일입출력이 UTF8 이던데요.
요새 회사에서 VS 만 쓰다보니 알게 되었습니다.
L은 C++ 표준에도 있는 것으로 wide character를 위한 것이죠.
아마 long 내지는 large의 약자일 것 같습니다.
L'a', L"abc" 이렇게 씁니다.
unix 유니코드 API...
말을 좀 애매하게 썼는데 윈도우즈 API는 유니코드만 받아들이는데, 유닉스쪽은 locale이 *.utf-8로 설정되어 있을 때 문자열을 utf-8로 해석하는거지, 인코딩이 고정되어 있지 않다 라는 의미로 써봤습니다.
utf-8로 하면 기존 프로그램 호환되는 건 좋은데, 글자 하나가 차지하는 바이트 수가 제각각이다 보니까, 문자열을 다루기가 까다롭더라고요..
삭제
삭제
그냥 직접 visual c++에서 두개 종류의 프로그램을 짜 보는게
느낌이 팍팍 오실것 같습니다.
분명한건 위에 글들처럼 unicode로 개발 하는것과 아닌것의 차이가 있습니다.
적어도 windows 상에서는 말이죠
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
댓글 달기