<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>Game &amp; 개발방법론</title>
	<link>http://includes.egloos.com</link>
	<description>실행하자구~</description>
	<language>ko</language>
	<pubDate>Wed, 14 May 2008 01:26:08 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>Game &amp; 개발방법론</title>
		<url>http://pds9.egloos.com/logo/200805/28/18/d0042518.jpg</url>
		<link>http://includes.egloos.com</link>
		<width>80</width>
		<height>47</height>
		<description>실행하자구~</description>
	</image>
  	<item>
		<title><![CDATA[ 우연한 발견 - Serendipity(세런디피티) ]]> </title>
		<link>http://includes.egloos.com/1888231</link>
		<guid>http://includes.egloos.com/1888231</guid>
		<description>
			<![CDATA[ 
  <table cellspacing="0" cellpadding="0" width="664" bgcolor="white"><tbody><tr><td width="664" height="44"><p align="center"><span style="FONT-SIZE: 16pt"><b><span style="COLOR: #0000ff">Serendipity - 세런디피티</span></b></span></p></td></tr><tr><td width="664" height="49"><p align="center"><b>Serendipity</b>란 과학기술의 세계에서 발견과 발명이 우연에 의해 이루어지는 것을 뜻함</p></td></tr><tr><td width="664"><p>&nbsp;&nbsp;1. Horace Walpole(1717-1797)이 '세런딥 왕국의 3명의 왕자의 여행과 모험'이라는 동화를 읽고 처음 사용.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Walpole이 Serendipity라는 단어를 처음 사용하게 된것은 1754년 1월 28일 메디치가의 방패 문장에 관한 흥미로운 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;사실을 어떻게 발견했는지를 기술하기 위해 친구에게 쓴 편지의 시작부분에서였다. </p><p>&nbsp;&nbsp;2. Serendipity는 사람 혹은 사건에 응용되는 것이 아니라 오히려 발견의 특성에 부여할 수 있는 명사이다. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Serendipity는 항상 관련된 사람으로부터의 무엇인가와 사람들이 처해 있는 상황으로부터의 무엇인가가 결합된 것이다. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;문제는 창의적인 행동을 관찰한 사람들이 지나치게 우연의 사건이나 혹은 영민함 한쪽에만 원인을 돌리는데 있다. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;그러나 이 두 가지 요소는 상호 의존적이다 - <b><span style="COLOR: #33cc00">우연한 사건에 관련된 사람이 실제 가치를 볼 수 있을 경우에만, <br>&nbsp;&nbsp;&nbsp;&nbsp;이 사건은 운 좋은 결과로 나타날 수 있는 것이다</span></b><span style="COLOR: #33cc00">.</span> 실 생활속의 사람들은 특정 영역에서만 영민할 수 있으며, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이 분야에서만 우연한 사건을 운 좋은 사건으로 변화시킬 수 있다. 사람이 영민해 질 수 있는 영역은 자신의 특정 지식, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;인생과 업무에서의 경험, 개인적 특성과 흥미의 결과인 것이다. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Serendipity의 진정한 의미를 고려한다면 기업에서 조직원의 창의성 발현에 많은 시사점을 가져다 줄 것이다. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;요사이 중요시되는 부가가치를 창출하는 지식근로자 (Knowledge Worker) 역시 Serendipity를 통해 조직 내에서 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;길러 질 수 있을 것이다</p><p>&nbsp;&nbsp;3. 아르키메데스의 '유레카'일화나 뉴튼의 '중력 발견 일화'를 생각해 보자. </p><p>&nbsp;&nbsp;&nbsp;</p><p><b>&nbsp;&nbsp;Serendipity의 예</b></p><p><b>&nbsp;1. X-RAY - Roentgen이 음극선 형광을 연구중에 근처 테이블에 이상한 빛이 흘러나오는 것을 발견하면서 <br></b></p><p><b>&nbsp;2. Penicillin - 플레밍이 화농균을 배양하다가 우연히 배양접시에 세균무리가 죽어있는 것을 보고</b></p><p><b>&nbsp;3. Dynamite - 노벨이 연구중에 손가락을 다쳐 외상치료제인 콜로디온으로 치료를 하면서</b></p><p><b>&nbsp;4. 합성고무 - 찰스 굿이어가 냄비에 황을 녹이다가 실수로 생고무위에 엎지르게 되면서</b></p><p><b>&nbsp;5. 아세톤의 대량생산 - 바이츠만(이스라엘 초대 대통령)의 우연한 박테리아 발견을 계기로</b><br></p><p>&nbsp;<b>6. Metallocene촉매 - 윌킨슨이 꿈속에서 샌드위치를 보고 화합물의 구조를 샌드위치형태로 그리면서</b></p><p><b>&nbsp;7. 벤젠의 방향족 화합구조 - 케쿨러가 졸다가 뱀이 자기꼬리를 물고 빙빙도는 꿈을 꾸면서 </b><br></p><p>&nbsp;</p></td></tr></tbody></table>			 ]]> 
		</description>

		<comments>http://includes.egloos.com/1888231#comments</comments>
		<pubDate>Wed, 14 May 2008 01:26:08 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 5년후 이런 박사가 뜬다 ]]> </title>
		<link>http://includes.egloos.com/1645294</link>
		<guid>http://includes.egloos.com/1645294</guid>
		<description>
			<![CDATA[ 
  <p>연세대 김준성 직업평론가가 흥미로운 자료를 보내왔습니다.<br>박사라고 다같은 박사가 아니다.5년후 유망한 박사학위를 분석해서 주셨군요.유럽/미국/아시아 지역에 따라 유망한 박사학위가 다르네요.<br>무릇 직업을 생각한다면 지금 잘나가는 직종보다는 10년후를 생각하라고 하지요. 지금 대학 3,4학년 혹은 공부를 생각하고 계신 직장인들이라면 관심있게 보실만 한 것 같습니다.</p><p><br>유럽의 박사 유망직업 시장<br>1.영양 생화학 박사<br>2.식품 가공 및 효소학 박사<br>3.시각디자인박사<br>4.비판 커뮤니케이션 박사<br>5.조형 예술학 박사<br>6.환경건축학 박사<br>7.패션 마켓팅 박사<br>8.해양스포츠 박사<br>9.관광학 박사<br>10.와인학 박사<br>11.광고 음악학 박사<br>12.사회보장법 박사<br>13.도시단지설계박사<br>14.방송 이론 및 영상 제작학 박사<br>15.금융수학박사</p><p><br>미국의 박사 직업시장<br>1.부동산학 박사<br>2.약리학 박사<br>3.측량 및 지형공간 정보 박사<br>4.진단 방사선학 박사<br>5.핵 물리학 박사<br>6.의용 공학박사<br>7.항공 우주공학 박사<br>8.통계학 박사<br>9.스포츠 마케팅 박사<br>10.화폐금융론 박사<br>11.국제자본시장 박사<br>12.스포츠 법 박사<br>13.의료윤리 박사<br>14.목회 심리학 박사<br>15.미생물학 박사<br>16.환경영향 평가학 박사<br>17.혼성 신호및 전자회로설계박사</p><p><br>아시아 국가 박사유망 직업시작<br>1.노인복지학 박사<br>2.통신 신호처리 박사<br>3.레이저 광공학 박사<br>4.로봇 공학 박사<br>5.사이버홍보학 박사<br>6.병원 경영학 박사<br>7.화학박사<br>8.만화학 박사<br>9.반도체공학 박사<br>10.자동차 엔진 공학박사<br>11.구름 물리학 박사<br>12.단백직 생화학 박사<br>13.나노박사<br>14.도시 교통공학 박사<br>15.컴퓨터 게임 공학박사<br>16.노동경제학 박사</p><p><br>=제맘대로 분석을 하자면 유럽은 아시아국가보다 앞서 고령화가 찾아왔고 그에 대한 대비, 그와 관련한 산업이 발전한 것 같습니다.먹는 것 위주의 영양 생화학/식품가공 및 효소학이 우선순위에 올라있는 것을 보면 "얼마나 오래 사느냐"보다는 "되도록이면 건강하게 오래 살고싶다."는 욕구가 반영된 것 아닌가 싶습니다.<br>전 개인적으로 환경건축학 /도시단지설계학에 흥미가 가네요.</p><p>=미국.개발을 해도해도 여전히 텅텅 남아오는 땅덩이.부동산과 측량,지형공간 등으로 나타난 것 같습니다.항공우주공학이나 핵 물리학 쪽은&nbsp; 제가 별로 관심이 없어서 잘은 모르지만,냉전구조가 무너지면서 러시아 과학자들이 실업자 처지가 됐었던 과거를 떠올려봅니다.중국이 새로운 경쟁자로 떠오를 수 있겠군요.<br>의료 산업의 메카인 만큼 진단 방사선학,의용공학,의료윤리 등이 주목을 받고 있군요. 의용 공학이란 의료용 장비를 개발하는 걸 말하는 거랍니다.</p><p>=아시아 국가 최대의 화두는 고령화.8위에 언급된 만화학 박사도 재밌군요.김 샘은 "만화를 단순히 좋아해서 많이 읽는 것으로는 부족하고,세상을 관조하듯 본질의 흐름을 읽어내야한다."고 하시는군요.한국에서는 이미 만화 홍보학이 학문으로 자리잡고 있구요.</p><p>원 분석논문을 첨부하니 자세한 내용이 궁금하신 분은 다운해서 받아보시기 바랍니다.<br></p>			 ]]> 
		</description>

		<comments>http://includes.egloos.com/1645294#comments</comments>
		<pubDate>Fri, 14 Dec 2007 01:08:12 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ DXUT의 흐름도 ]]> </title>
		<link>http://includes.egloos.com/1627055</link>
		<guid>http://includes.egloos.com/1627055</guid>
		<description>
			<![CDATA[ 
  <div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds6.egloos.com/pds/200712/04/18/d0042518_475503cb721b5.gif" width="420" height="480" onclick="Control.Modal.openDialog(this, event, 'http://pds6.egloos.com/pds/200712/04/18/d0042518_475503cb721b5.gif');" /></div>			 ]]> 
		</description>
		<category>프로그래밍팁</category>

		<comments>http://includes.egloos.com/1627055#comments</comments>
		<pubDate>Tue, 04 Dec 2007 07:37:54 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Visual Studio 2005를 이용한 TDD 기법 적용 1-1 ]]> </title>
		<link>http://includes.egloos.com/1625028</link>
		<guid>http://includes.egloos.com/1625028</guid>
		<description>
			<![CDATA[ 
  <div class="content"><div class="content"><p>게임의 1차 프로토타입을 끝내느라 눈코 뜰새 없이 바빴다. 그래서 이제서야 VisualStudio&nbsp;에서 TDD 적용에 대한 글을 쓰게되었다.<br>이번 프로젝트에 TDD를 적용하면서 느낀 점은 SI 쪽 특히 데이타베이스 핸들링에는 이 기법을 적용하기가 아주 좋다.<br>허나 게임쪽 특히 클라이언트 그 중에서도 GUI 적용에는 상당히 힘들다는 점이다. 그럼에도 불구하고&nbsp;프로젝트 여기저기에 쓰면서 전보다 훨씬&nbsp;나은&nbsp; 코드를 뽑아 냈다는 것에는 아주 만족한다. 또 하나 알게 된 사실은 비주얼 스튜디오 2005 프로페셔널 에는 테스트 할수 있는 기능이 Team suite&nbsp;버젼보다 훨씬 적다. 제대로 된 TDD 기법을 해보려면 Team suite 버젼이 필요하다.<br>그넘은 아주 막강하다...역시 값이 다른 이유가 있었구나...그치만 상술이라는거...^^<br><br>8월에 처음 Visual Studio에서 TDD 사용하기 라는 글을 올렸는데 이제 벌써 12월이다. 그새 4개월이나 흘렀구나...ㅡㅡ;;;<br>저의 블로그에 아무도 오지 않는줄 알았는데 2분이나 답글을 달아 주셨고, 관심을보여주셔서 글로만 쓰는것보다 그림을 첨부하여 사용법에 대해서 올리는게 낮겠다 싶어 시간이 들더라도 그렇게 하기로 마음먹었다.</p></div></div>			 ]]> 
		</description>
		<category>Agile, XP, TDD</category>

		<comments>http://includes.egloos.com/1625028#comments</comments>
		<pubDate>Mon, 03 Dec 2007 07:13:58 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 게임 1차 프로토타입 끝나다 ]]> </title>
		<link>http://includes.egloos.com/1625006</link>
		<guid>http://includes.egloos.com/1625006</guid>
		<description>
			<![CDATA[ 
  지난주 2007-11-30 우리팀이 제작하는 게임의 1차 프로토타입 제작이 완성 되었다.<br>이제부터 좀더 성실히 블로그를 제작해 나가볼까나~ ^^			 ]]> 
		</description>
		<category>개발일지</category>

		<comments>http://includes.egloos.com/1625006#comments</comments>
		<pubDate>Mon, 03 Dec 2007 07:00:42 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 내가 좋아하는 광고 ]]> </title>
		<link>http://includes.egloos.com/1607969</link>
		<guid>http://includes.egloos.com/1607969</guid>
		<description>
			<![CDATA[ 
  <a href="http://www.youtube.com/watch?v=XiBX8MkFkd4">http://www.youtube.com/watch?v=XiBX8MkFkd4</a><br><br>일본 혼다사의 광고인데 혼다가 걸어온 길을 그대로 보여주는 광고입니다. 처음에 작은 오토바이로 시작하여 현재는 제트기와 로봇까지 만드는 혼다.. 유럽에서인가는 광고 대상을 먹었다고 하네요<br><br>그 기술의 열정에는 감동을 느끼지 않을 수 없습니다. 개발자로서 혼다와 같은 길을 걷겠다고 마음먹어 봅니다~<br>			 ]]> 
		</description>

		<comments>http://includes.egloos.com/1607969#comments</comments>
		<pubDate>Sat, 24 Nov 2007 06:43:20 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [펌]바이트 정렬에 대한 디버깅 경험 ]]> </title>
		<link>http://includes.egloos.com/1507333</link>
		<guid>http://includes.egloos.com/1507333</guid>
		<description>
			<![CDATA[ 
  거의 2주에 걸쳐 헤매다가 잡은 버그에 대한 경험이다. <p>DSAPI로 도미노 필터를 제작하고 있는데, 이상하게 어떤 클래스가 delete만 되면 죽어버리는 것이었다. 물론 중간에 어떤 포인터를 가져와서 호출하는 코드도 있었는데, 계속 그런 코드들에서 죽는 것이었다. 코드 로직을 통해서도 어디 포인터를 바뀌는 코드도 없고, 처음 생성하고는 read only로 읽기만 하기 때문에 사용하는 부분에서는 문제가 없었다. 그래서 혹시나 어디선가 할당된 이상으로 써버리는 것이 아닌가 하는 의심을 가지고 문제가 생기는 클래스를 추적하기 시작했다. 두 클래스가 걸렸는데 멤버가 내부적으로는 int, string 등 검증된 코드만을 쓰고 있어서 그럴리가 없다는 생각으로 다른 곳을 찾아보았지만 그 값들을 초기화 하는 부분 또한 기존에 많이 쓰던 검증된 코드로 통해 초기화 하고 있었고, 또한 이전에서도 이 코드를 사용하였기 떄문에 이 코드가 틀리다는 건 너무 이상했다. 실제로 프로젝트가 Common 한 정적 라이브러리와 이것을 사용하는 DSAPI 필터 라이브러리로 나누어져 있었는데 Common 은 것은 다른 곳에서도 쓰고, 거기서는 이상 없었기 때문에 그 코드에 대한 의심은 안해야 되지 않을까 싶었지만, 혹시나 해서 일말의 의구심을 가지고 보고 있었다. <p>그래서 추적해보기로 계속 해서 1주일 정도 delete 부분 바꿔보고, Common library 에 있는 두 클래스를 조금씩 수정해보는 식으로 하였는데, 어느날 이상한 현상을 발견하였다. bool 변수가 중간에 끼어 있었는데 이걸 위치를 바꿔보니, 에러가 안 나는 것이었다. (특정 변수 뒤로 선언했다.) 기존에 계속 이상한 값을 가지던 포인터도 제대로 값이 들어가고, 정상적으로 돌아가는 것이었다. 왜 위치만 바뀌면 제대로 되는 것일까라고 생각하고 드디어 어셈블리와 메모리 레벨에서 추적해서 들어가기 시작했다. 어셈블리와 메모리를 계산해서 추적해보니 이상하게 4바이트를 덜 가서 값을 가져오는 것이었다.그래서 값이 이상하고, 죽고 그러는데... 그래서 혹시나 해서 SP5 로 업데이트 하고(그 떄는 업데이트 안되서 기존 버전을 쓰고 있었다. 왜 안되었는지 잘...) 새로 리빌드 해보기도 했지만 그 현상을 마찬가지 였다. 왜 하필이면 4바이트일까...처음에는 컴파일러가 계산을 잘못해서 코드를 생성했나 싶었지만 아무리 생각해도 그게 이상일리는 없을 것 같고 해서 이것저것 바꿔보다가...결국 바이트 정렬 떄문이 아닐까 하는 생각이 들었다. 그런데 바이트 정렬이 구조체에서는 만약 적용해봤지만 클래스에서 내부적인 동작 도중에 문제 생긴다는 건 처음 들어본지라 너무 이상하다 싶었다. 너무 이상하다 싶어 주위에 베테랑급 사수들에게 물어봤지만 첨 들어보는 현상이라고 하였다. Sun이나 AIX에서 가끔 이상하게 동작하는 경우를 알려주긴 했지만 이번 경우에는 그게 아닌듯 싶고 하였다. <p>그래서 Common 라이브러리에 있는 bool 변수를 BOOL 즉 int 형으로 바꾸어보았더니 모두 OK 였다. 아무래도 바이트 정렬 문제가 확실했다. 그래서 일단 그렇게 하면서 계속 근본 원인을 뒤져보다 우연히 다른 함수 떄문에 도미노 제공 헤더를 뒤져보게 된 일이 있었는데, 거기서 정말 충격적인 코드를 보았다 헤더 차원에서 #pragma pack(1)를 해놓은 것이었다. 그제서야 어떻게 돌아가는 건지 이해가 되었다. 쩝 그런 것이었구나 하고... <p>원인은 이렇다. Common 한 라이브러리는 VC6 기본인 8바이트 정렬로 컴파일된다. 하지만 DSAPI 필터 프로젝트는 그 헤더 때문에 1바이트 정렬로 모두 컴파일이 되게 된다. 따라서 이 쪽에서는 1바이트 기준으로 new를 해서 메모리를 구성하고 실제로 링크된 다른 라이브러리 바이너리에서는 8바이트 기준으로 정렬해서 처리되기 떄문에, 그 사이에 미묘한 차이가 생겨버린 것이다. 그래서 컴파일러는 제대로 코드를 생성했지만 두 바이너리 생성 차이로 한 EXE내에서 두 가지 바이트 정렬된 부분이 프로그래머가 알지 못하게 생겨버리는 경우였다. 그래서 다시 강제적으로 8바이트 세팅해주고 나니 아주 잘 돌더라는 그런 뼈아픈 얘기였다. <p>나중에 알게된 사실이지만 DSAPI 튜토리얼에 아주 조그마한 하게 1바이트 정렬을 한다는 얘기가 있긴 했다. 하지만 제대로 강조되지 않았기에 모르고 넘어가고 이런 삽질을 경험하게 된 것인데...정말 맘 아픈 경우이다 ㅠ.ㅠ 뭐 이거 덕분에 어셈블리와 메모리 주소를 통한 디버깅을 자유자재로 할 수 있게 되어버렸다</p>			 ]]> 
		</description>
		<category>프로그래밍팁</category>

		<comments>http://includes.egloos.com/1507333#comments</comments>
		<pubDate>Tue, 02 Oct 2007 08:56:56 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [펌] L 리터럴과 유니코드 인코딩 (#pragma setlocale(".949") ) ]]> </title>
		<link>http://includes.egloos.com/1506890</link>
		<guid>http://includes.egloos.com/1506890</guid>
		<description>
			<![CDATA[ 
  <div class="post_body">c++에서 문자를 저장하기 위해 8 비트 크기의 char 타입 이외에 16 비트 크기(<u><span style="COLOR: #0000ff">윈도우에서는 16 비트를 유닉스 계열에서는 32 비트를 사용한다고 합니다.</span></u>)의 와이드 캐릭터를 저장하는 wchar_t 타입을 제공하고 있습니다. wchar_t 타입에는 문자의 MBCS/DBCS 및 <strike>UCS</strike>UTF-16(윈도우에서는 little endian을 기본적으로 사용합니다.) 인코딩을 저장할 수 있습니다. 또, wchar_t와 함께 와이드 캐릭터/문자열 상수를 지정하기 위해 "L"을 사용합니다. <br></div><div class="citation"><br>문자열의 인코딩은 소프트웨어의 globalization 을 위해 필요한 여러 이슈중 하나로 <u><span style="COLOR: #0000ff">MSDN</span></u> 및 <u><span style="COLOR: #0000ff">구글 검색</span></u>을 통해 이 내용을 다루는 많은 웹 페이지를 검색해 볼 수 있습니다. 그 중 유니코드와 캐릭터 셋의 이해를 개발자의 필수항목으로 지적하고 있는 <u><span style="COLOR: #0000ff">Joel Spolsky의 글</span></u>을 보는 것이 도움이 될 듯합니다. 이 글은 얼마전 <u><span style="COLOR: #0000ff">jrogue님이 번역</span></u>한 "조엘 온 소프트웨어"를 통해 한글로도 읽어 볼 수 있습니다. <br>또 <u><span style="COLOR: #0000ff">The Complete Guide to C++ Strings, Part I - Win32 Character Encodings</span></u> 도 참고할 만한 문서입니다. 이 문서는 한글로도 번역되어 있습니다.(<u><span style="COLOR: #0000ff">[1]</span></u>, <u><span style="COLOR: #0000ff">[2]</span></u>) <br></div><div class="post_body"><br><br>다음은 wchar_t와 유니코드를 다루면서 생각하지도 못했던 문제로 하루를 꼬박 보내버리게 된 이야기입니다. <br><br>문제는 <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">wcslen</b>() 메소드를 통해 L"" 로 지정된 문자열의 문자수를 알아오는데에서 시작했습니다. <br></div><div class="post_body"><pre>setlocale(LC_ALL, ".949"); <br>wchar_t *wstr1 = L"abc"; <br>printf("length: %d", <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">wcslen</b>(wstr1)); <br> <br>--- 결과 --- <br>length: 3</pre></div><div class="post_body"><br>원하는 결과였습니다. 그런데 다음 코드의 결과는 이상합니다. <br></div><div class="post_body"><pre><span style="BACKGROUND-COLOR: #a6ff4d">setlocale(LC_ALL, ".949"); </span><br>wchar_t *wstr2 = L"가나다"; <br>printf("length: %d", <b style="COLOR: black; BACKGROUND-COLOR: #ffff66">wcslen</b>(wstr2)); <br> <br>--- 결과 --- <br>length: 6</pre></div><div class="post_body"><br>분명히 타입은 wchar_t 이므로 결과는 3이 나와야 할 것 같은데 char 타입과 strlen() 함수를 사용할 때와 마찬가지로 6이 나옵니다. 그래서 메모리를 덤프해봤습니다. L"abc" 의 경우 다음과 같이 USC-16 little endian 으로 정확히 저장되었습니다. </div><div class="post_body"><pre>61 00 62 00 63 00 00 00</pre></div><div class="post_body"><br>그런데 두번째 L"가나다" 의 경우</div><div class="post_body"><pre>B0 00 A1 00 B3 00 AA 00 B4 00 D9 00 00 00</pre></div><div class="post_body">(<u><span style="COLOR: #0000ff">유니코드 한글 코드테이블</span></u>과 <u><span style="COLOR: #0000ff">KS-5601 코드테이블</span></u>을 참고하세요) <br>"가나다"의 DBCS 인코딩을 단순히 16비트로 저장하고 있는 것이였습니다. 참고로 "가나다"의 DBCS 인코딩은 다음과 같습니다. </div><div class="post_body"><pre>B0 A1 B3 AA B4 D9 00</pre></div><div class="post_body"><br>혹시 지금 제가 사용 중인 영문 윈도우의 문제가 아닐 까 싶어, vmware를 통해 한글 윈도우 98 SE와 한글 윈도우 2000을 사용해 테스트해 봐도 같은 결과가 나오더군요. <br><br>이번에는 명시적으로 MBCS 문자열을 유니코드(USC-16 little endian)로 변환해 wchar_t에 저장해 보았습니다.</div><div class="post_body"><pre>setlocale(LC_ALL, ".949"); <br>char *str2 = "가나다"; <br>wchar_t wstr2_uni[blocksize]; <br>memset(wstr2_uni, 0, blocksize * sizeof(wchar_t)); <br>mbstowcs(wstr2_uni, str2, _mbstrlen(str2)); <br> <br>--- wstr2_uni의 메모리 덤프 --- <br>00 AC 98 B0 E4 B2 00 00</pre></div><div class="post_body">이렇게하니 처음에 원했던 바 데로 USC-16 little endian 으로 저장되더군요. <br><br><br>결론은 <br></div><div class="post_body"><ul type="1"><li>L""상수는 문자열을 유니코드로 인코딩하지 않는다. 다만 문자열을 16비트 wchar_t로 저장할 뿐이다. (이렇게 저장되어도 영문 Ascii는 유니코드 인코딩과 같은 결과를 얻을 수 있습니다.) <br><li>유니코드로 인코딩된 문자열을 얻기 위해서는 MBSC로 된 문자열을 유니코드로 변환해 사용해야 된다. <br></li></ul></div><br><br>그건 그렇다고 치고, 아쉬운 점은 제가 본 유니코드 관련 문서들에서는 L"" 리터럴의 이와 같은 특성에 대한 내용은 찾아볼 수 없었다는 것입니다. <br>아마도 정작 유니코드의 사용이 필요한 언어권의 사람들이 쓴 것이 아닌 대부분 영문(혹은 라틴계열 문자)을 사용하는 사람들이 작성한 글이거나 이 글을 번역한 글이기 때문일 것이라 생각해 봅니다. <br><br>ps) 수십년간의 소프트웨어의 역사가 흘렀지만 아직도 globalization은 달성하기 힘든 높은 수준의 요구사항이 아닐까 합니다. <br><br><b>update</b> <br>혹시나 하고 #pragma를 조사해보다 <u><span style="COLOR: #0000ff">#pragma setlocale()</span></u>를 발견했습니다. 다음과 같이 지정해줬더니 L"" 리터럴 문제가 모두 해결되는 군요. <pre><span style="BACKGROUND-COLOR: #a6ff4d">#pragma setlocale(".949")</span></pre><p><span style="BACKGROUND-COLOR: #a6ff4d">//결국 컴파일 레벨에서 지정해주어야 한다.</span></p><p><br>좀 더 알아보고 포스트할 걸 그랬습니다.<br></p>			 ]]> 
		</description>
		<category>프로그래밍팁</category>

		<comments>http://includes.egloos.com/1506890#comments</comments>
		<pubDate>Tue, 02 Oct 2007 04:03:10 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 멀티바이트를 유니코드 문자열로 혹은 역으로 변환하는 함수 ]]> </title>
		<link>http://includes.egloos.com/1504681</link>
		<guid>http://includes.egloos.com/1504681</guid>
		<description>
			<![CDATA[ 
  <p>mbstowcs() : 멀티바이트 스트링을 와이드캐릭터 스트링으로 변경</p><p>wcstombs() : 와이드캐릭터 스트링을 멀티바이트 스트링으로 변경</p><!-- //포스팅 --><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<span style="COLOR: #808000">#ifdef</span> WIN32<br>&nbsp; <span style="COLOR: #808000">#pragma</span> warning(disable:<span style="COLOR: #800080">4786</span>)<br><span style="COLOR: #808000">#endif</span><br><span style="COLOR: #808000">#include</span> <span style="COLOR: #800000">&lt;</span>iostream<span style="COLOR: #800000">&gt;</span><br>using namespace std;<br><br><span style="COLOR: #008000">void</span> string2wstring(wstring <span style="COLOR: #800000">&amp;</span>dest,<span style="COLOR: #008000">const</span> string <span style="COLOR: #800000">&amp;</span>src)<br><span style="COLOR: #ff00ff">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp; dest.resize(src.size());<br>&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">for</span> ( <span style="COLOR: #008000">unsigned</span> <span style="COLOR: #008000">int</span>&nbsp; i<span style="COLOR: #800000">=</span><span style="COLOR: #800080">0</span>; i<span style="COLOR: #800000">&lt;</span>src.size(); i<span style="COLOR: #800000">++</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dest[i] <span style="COLOR: #800000">=</span> static_cast<span style="COLOR: #800000">&lt;</span><span style="COLOR: #008000">unsigned</span> <span style="COLOR: #008000">char</span><span style="COLOR: #800000">&gt;</span>(src[i]);<br><span style="COLOR: #ff00ff">}</span><br><br><span style="COLOR: #008000">void</span> wstring2string(string <span style="COLOR: #800000">&amp;</span>dest,<span style="COLOR: #008000">const</span> wstring <span style="COLOR: #800000">&amp;</span>src)<br><span style="COLOR: #ff00ff">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp; dest.resize(src.size());<br>&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #008000">for</span> (<span style="COLOR: #008000">unsigned</span> <span style="COLOR: #008000">int</span> i<span style="COLOR: #800000">=</span><span style="COLOR: #800080">0</span>; i<span style="COLOR: #800000">&lt;</span>src.size(); i<span style="COLOR: #800000">++</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dest[i] <span style="COLOR: #800000">=</span> src[i] <span style="COLOR: #800000">&lt;</span> <span style="COLOR: #800080">256</span> ? src[i] : ' ';<br><span style="COLOR: #ff00ff">}</span><br><br><span style="COLOR: #008000">int</span> main ( <span style="COLOR: #008000">int</span> argc, <span style="COLOR: #008000">char</span>** argv )<br><span style="COLOR: #ff00ff">{</span><br>&nbsp; string str <span style="COLOR: #800000">=</span> <span style="COLOR: #008080">"한글 English"</span>;<br>&nbsp; wstring wstr;<br><br>&nbsp; string2wstring( wstr, str );<br>&nbsp; wcout &lt;&lt; L<span style="COLOR: #008080">"[2Byte] "</span> &lt;&lt; wstr.c_str() &lt;&lt; endl;<br>&nbsp; wstring2string ( str, wstr );<br>&nbsp; cout &lt;&lt; <span style="COLOR: #008080">"[1Byte] "</span> &lt;&lt; str.c_str() &lt;&lt; endl;<br>&nbsp; <span style="COLOR: #008000">return</span> <span style="COLOR: #800080">0</span>;<br><span style="COLOR: #ff00ff">}</span><br></p>			 ]]> 
		</description>
		<category>C/C++, Debugging</category>

		<comments>http://includes.egloos.com/1504681#comments</comments>
		<pubDate>Mon, 01 Oct 2007 02:35:22 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
	<item>
		<title><![CDATA[ f8 string / wstring 변환  ]]> </title>
		<link>http://includes.egloos.com/1504676</link>
		<guid>http://includes.egloos.com/1504676</guid>
		<description>
			<![CDATA[ 
  <p>마지막으로 안시와 유니코드 문자열의 간단한 변환은 vc 에서는 A2W(), W2A() 매크로를 이용하는 방법이 있습니다.<br>atl 매크로를 이용하지만, 매크로이므로 atl 라이버러리와 링크없이 이용할수있는 장점이 있습니다.<br><br>#include &lt;atlcore.h&gt;<br><br>void MyTest()<br>{<br>&nbsp;&nbsp;&nbsp; USES_CONVERSION;<br>&nbsp;&nbsp;&nbsp; std::string s1("abc");<br>&nbsp;&nbsp;&nbsp; std::wstring s2(A2W(s1.c_str()));<br>&nbsp;&nbsp;&nbsp; s1 = W2A(s2.c_str());<br>}</p>&nbsp; <div class="article"><strong><span style="COLOR: #ffffff; BACKGROUND-COLOR: rgb(0,153,102)"><br><br>출처: </span></strong><a class="con_link" href="http://cpplog.tistory.com/" target="_blank"><strong><span style="COLOR: #ffffff; BACKGROUND-COLOR: rgb(0,153,102)">CPP.log</span></strong></a><a class="con_link" href="http://feeds.feedburner.com/cpplog" target="_blank"><strong><span style="COLOR: #ffffff; BACKGROUND-COLOR: rgb(0,153,102)"><img id="userImg3324743" style="CURSOR: pointer" onclick="popview(this.src)" src="http://fs.tistory.com/custom/blog/2/29674/skin/images/xml.gif" onload="'setTimeout(""resizeImage(3324743)",200)'></span></strong></a></div><div class="article"><br>이전 글 <a class="con_link" href="http://cpplog.tistory.com/19" target="_blank"><span style="COLOR: #5a5194">string / wstring 변환</span></a>을 응용해서 utf8 string과 wstring 간의 변환 방법을 알아보자. <br><br>mbs_to_wcs와 wcs_to_mbs 함수에 utf8을 지원하는 locale을 설정하면 쉽게 변환할 수 있다. <br><br><div style="BORDER-RIGHT: rgb(0,0,0) 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: rgb(0,0,0) 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; OVERFLOW: auto; BORDER-LEFT: rgb(0,0,0) 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: rgb(0,0,0) 1px dotted; FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(255,255,240)">std::wstring wcs(L"가나다라마바사");<br>std::string utf8s;<br><br>std::locale loc("ko_KR.UTF-8"));<br>// wstring -&gt; utf8<br>utf8s = wcs_to_mbs(wcs, loc);<br>// utf8 -&gt; wstring<br>wcs = mbs_to_wcs(utf8s, loc);</div><br>하지만, 이 방법은 OS의 특성을 탄다. (Windows에는 "ko_KR.UTF-8"이라는 locale이 없다.)<br>시스템에 의존적이지 않게 만들려면 utf8을 위한 codecvt를 직접 구현해 주어야 한다. boost에는 이미 utf8_codecvt_facet이라는 class가 존재한다. 이미 잘 만들어진 구현이 있기 때문에 직접 구현하지 않고 가져다 쓰도록 하자. 그런데 불행히도 이 소스는 public이 아니고 boost의 몇몇 라이브러리(program_options, serialization)를 위한 구현이기 때문에 바로 사용하기는 힘들다. 그렇다고 방법이 없는 것은 아니다.<br><br>우선 boost/detail/utf8_codecvt_facet.hpp와 libs/detail/utf8_codecvt_facet.cpp를 가져 온다. 그리고 나서 utf8_codecvt.h와 utf8_codecvt.cpp 파일을 다음과 같이 만들어 준다.<br><br>[utf8_codecvt.h]<br><div style="BORDER-RIGHT: rgb(0,0,0) 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: rgb(0,0,0) 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; OVERFLOW: auto; BORDER-LEFT: rgb(0,0,0) 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: rgb(0,0,0) 1px dotted; FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(255,255,240)">#ifndef _UTF8_CODECVT_H_<br>#define _UTF8_CODECVT_H_<span id="callbacknestcpplogtistorycom20945" style="FLOAT: left; WIDTH: 1px; HEIGHT: 1px"><embed id="bootstrappercpplogtistorycom20945" src="http://cpplog.tistory.com/plugin/CallBack_bootstrapperSrc" width="1" height="1" type="application/x-shockwave-flash" invokeurls="false" autostart="false" allowscriptaccess="never" allowscriptaccess="never" wmode="transparent" enablecontextmenu="false" flashvars="&amp;callbackId=cpplogtistorycom20945&amp;host=http://cpplog.tistory.com&amp;embedCodeSrc=http%3A%2F%2Fcpplog.tistory.com%2Fplugin%2FCallBack_bootstrapper%3F%26src%3Dhttp%3A%2F%2Fcpplog.tistory.com%2Fplugins%2FCallBack%2Fcallback%26id%3D20%26callbackId%3Dcpplogtistorycom20945%26destDocId%3Dcallbacknestcpplogtistorycom20945%26host%3Dhttp%3A%2F%2Fcpplog.tistory.com%26float%3Dleft" swliveconnect="true"></span><br><br>#define BOOST_UTF8_BEGIN_NAMESPACE namespace boost { namespace mylib { <br>#define BOOST_UTF8_END_NAMESPACE }} <br>#define BOOST_UTF8_DECL <br>#pragma warning(push)<br>#pragma warning(disable : 4100) <br>#include "utf8_codecvt_facet.hpp" <br>#pragma warning(pop) <br>#undef BOOST_UTF8_DECL <br>#undef BOOST_UTF8_END_NAMESPACE <br>#undef BOOST_UTF8_BEGIN_NAMESPACE <br>&nbsp;<br>typedef boost::mylib::utf8_codecvt_facet utf8_codecvt;<br><br>#endif // _UTF8_CODECVT_H_<br></div><br>[utf8_codecvt.cpp]<br><div style="BORDER-RIGHT: rgb(0,0,0) 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: rgb(0,0,0) 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; OVERFLOW: auto; BORDER-LEFT: rgb(0,0,0) 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: rgb(0,0,0) 1px dotted; FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(255,255,240)">#define BOOST_UTF8_BEGIN_NAMESPACE namespace boost { namespace mylib { <br>#define BOOST_UTF8_END_NAMESPACE }} <br>#define BOOST_UTF8_DECL <br>#pragma warning(push) <br>#pragma warning(disable : 4244) <br>#pragma warning(disable : 4819) <br>#pragma warning(disable : 4100) <br>#include "utf8_codecvt_facet.cpp" <br>#pragma warning(pop) <br>#undef BOOST_UTF8_DECL <br>#undef BOOST_UTF8_END_NAMESPACE <br>#undef BOOST_UTF8_BEGIN_NAMESPACE <br></div><br>프로젝트에 utf8_codecvt.h와 utf8_codecvt.cpp를 추가하여 사용하면 된다.<br><br><div style="BORDER-RIGHT: rgb(0,0,0) 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: rgb(0,0,0) 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; OVERFLOW: auto; BORDER-LEFT: rgb(0,0,0) 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: rgb(0,0,0) 1px dotted; FONT-FAMILY: Courier New; BACKGROUND-COLOR: rgb(255,255,240)">std::wstring wcs(L"가나다라마바사");<br>std::string utf8s;<br><br>// new로 생성된 utf8_codecvt를 delete할 필요는 없다. <br>// locale 내부에서 알아서 delete 해준다.<br>std::locale loc(std::locale(""), new utf8_codecvt);<br>// wstring -&gt; utf8<br>utf8s = wcs_to_mbs(wcs, loc);<br>// utf8 -&gt; wstring<br>wcs = mbs_to_wcs(utf8s, loc);<br></div></div>			 ]]> 
		</description>
		<category>프로그래밍팁</category>

		<comments>http://includes.egloos.com/1504676#comments</comments>
		<pubDate>Mon, 01 Oct 2007 02:33:22 GMT</pubDate>
		<dc:creator>루키</dc:creator>
	</item>
</channel>
</rss>
