성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] A graphical depiction of the steps ...
[정성태] 질문을 주셔서 출판사 측에 문의를 했습니다. 약 한 달 정도 후...
[Thorondor
] @정성태 개인 블로그인데도 거의 커뮤니티 급 인 것 같아요. 요...
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
이번엔, 어떤 분이 질문한 것에 대한 답변을 올려 봅니다. 메일에 대한 답변이었기 때문에, 맨 아래의 질문 메일 내용을 먼저 읽어주세요. ^^ <hr> <P><FONT face="굴림" size="2">멀리서... 저까지 찾아주시다니.... ^^ 감사할 따름입니다. 답변이 늦어서,,, 이미 해결을 하셨는지 모르겠지만. ^^<BR> <BR> 우선, 저도 정확한 답변은 드릴 수 없습니다. 왜냐면, 다양한 클라이언트의 환경에서 테스트를 해보아야 하고, 그러한 문제를 가진 컴퓨터에서 해봐야 하는 경우도 있기 때문에 장담할 수 없습니다.<BR> <BR> 사실... ^^; 더 정확한 이유는... 저 역시 간간이 다국어에 대한 지식만을 습득했을 뿐, 제대로 된 다국어 프로젝트를 진행해 본 적이 한번도 없습니다.<BR> 따라서... 그냥 경험상으로 아는 사실만 나열해 보겠습니다.<BR> <BR> <BR> 일단... setlocale 함수에서 두 번째 인자를 ""로 주는 것은 해당 시스템에 설정된 "regional settings"를 그대로 받겠다는 의미입니다. MSDN 도움말에서의 표현을 빌리자면 "user-default ANSI code page obtained from the operating system"인 것이죠.<BR> <BR> <BR> <IMG src="/SysWebRes/bbs/multilang_jpn_test.PNG"></FONT></P> <DIV><FONT face="굴림" size="2"></FONT> </DIV> <DIV><FONT size="2"><FONT face="굴림"></FONT></FONT> </DIV> <DIV><FONT size="2"><FONT face="굴림">위의 화면에서 보는 것처럼... (일본어 판 윈도우즈입니다.) regional options의 기본적으로 사용될 region 세팅을 할 수가 있습니다. 이 때 설정한 값이 바로 setlocale( LC_TIMIE, "" );와 같이 두 번째 인자의 ""가 쓰일 때 대신 사용될 region입니다.</FONT></FONT></DIV> <DIV><FONT size="2"><FONT face="굴림"></FONT></FONT> </DIV> <DIV><FONT size="2"><FONT face="굴림">위의 예제는 일본어판 윈도우즈에서 "한국어"를 지정한 것입니다.</FONT></FONT></DIV> <DIV><FONT size="2"><FONT face="굴림">위에서 "한국어"를 지정하는 것과 "일본어"를 지정하는 것은</FONT></FONT></DIV> <DIV><FONT size="2"><FONT size="+0"><A href="http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome"><FONT face="굴림" color="#000000">http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=msnhome</FONT></A><FONT face="굴림"> </FONT></FONT></FONT></DIV> <DIV><FONT size="2"><FONT face="굴림">을 가보면 쉽게 알 수 있습니다 지정된 언어에 따라 일본어인 경우에는 </FONT><A href="http://www.msn.co.jp"> <FONT face="굴림" color="#000000">www.msn.co.jp</FONT></A><FONT face="굴림">로 가고,</FONT></FONT></DIV> <DIV><FONT size="2"><FONT face="굴림">한국어인 경우에는 </FONT><A href="http://www.msn.co.kr"><FONT face="굴림" color="#000000"> www.msn.co.kr</FONT></A><FONT face="굴림">로 갑니다.</FONT></DIV> <P><FONT face="굴림">^^ 다 아시는 내용이겠지만.</FONT></P> <P><FONT face="굴림">본격적으로 질문에 답을 하자면.</FONT></P> <DIV><FONT face="굴림">"Lee" 님이 지금 겪고 있는 문제는 바로... "일본어" 윈도우즈에서 "한국어" 설정을 한 경우와 비슷한 상황에서 나타나는" 것으로 보입니다."</FONT></DIV> <DIV><FONT face="굴림">그렇게 되면,,,</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">TCHAR *ptr = _tsetlocale(LC_TIME, _T("")); </FONT> </DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">에서 ptr == "Korean_Korea.949"가 나오게 되고, CTime.Format 결과는 아래와 같이 깨진 문자열이 나오게 됩니다.</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림"><IMG src="/SysWebRes/bbs/multilang_jpn_msgbox.PNG"></FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">그런데... 왜 깨지느냐...를 물으시는 건데요.</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">그건 바로, setlocale의 LC_TIME 인자에 원인이 있습니다. 즉... 해당 인자의 의미는 DATETIME 부분만 region 설정을 할 뿐, 그 외의 설정은 한국어가 아니기 때문에 나타납니다. 즉 이후의 (CTime.Format 내부에서 호출되는) "wcsftime" 등에서 날짜 처리 부분만 "Korean" 지역 설정이 되고 나머지 문자열 처리에서는 ANSI 설정이 그대로 들어가기 때문에 나타납니다.</FONT></DIV> <DIV><FONT face="굴림">(기본적으로 프로그램은 시작시에 setlocal( LC_ALL, "C") 설정이 들어간 것과 같다고 MSDN 도움말에 나옵니다.)</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">따라서... LC_TIME 에만 setlocale( LC_TIME, 'Korean" ); 적용이 되어 있고, 나머지 모든 처리는 setlocale( LC_ALL, "C" );를 기반으로 하기 때문에 문자열이 깨지는 것입니다.</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">너무 어렵게 돌아왔나요.... ^^;</FONT></DIV> <DIV><FONT face="굴림">답은 setlocale( LC_ALL, "" );이라고 설정하시면 해결됩니다.</FONT></DIV> <DIV><FONT face="굴림"></FONT> </DIV> <DIV><FONT face="굴림">물론, TCHAR은 wchar_t로 처리되도록 "#define _UNICODE"라고 되어 있어야 하지요. ^^</FONT></DIV> <DIV><FONT face="굴림"></FONT> <BR> <BR> -----Original Message-----<BR> From: XXXXXXXXXXXXXX<BR> Sent: Friday, October 21, 2005 6:07 AM<BR> To: 정성태<BR> Subject: Help about CTime::Format() function<BR> <BR> 안녕하세요, 정성태님.<BR> 이렇게 무례하게 이메일드려 죄송합니다. 저는 미국에서 소프트웨어를 개발하고 있는 XXX이라고 합니다.<BR> 다름이 아니오라, VC7를 사용하고있는데요.<BR> 저희제품은 UNICODE를 사용하기 때문에 char 대신에 wchar_t 혹은 TCHAR 를 사용합니다. 제가 질문하고자 하는것은, CTime 클래스를 이용하여 longdate 포맷을 하려고 하는데, 물론 서양 환경 (SBCS) 에서는 문제없이 날짜/시간 포맷이 잘되는데, 한글환경에서는 문제가 있다는게 발견 되어서 제가 그것을 고치려다보니까, 어쩔수없이 이처럼 무례를 범하게 되었습니다.<BR> <BR> 현재 문제가 제기된 함수에서 아래와 같이 시간을 format 하고있습니다.<BR> <BR> CTime time(0);<BR> TCHAR *ptr = _tsetlocale(LC_TIME, _T("")); CString strTmp = time.Format("%#x %X");<BR> <BR> MSDN 에 따른다면,<BR> strTmp = "Wednesday, December 31, 1969 19:00:00" (사용자 locale이 English일 경우) strTmp = "1969년 12월31일 수요일 오후 7:00:00" (사용자 locale이 한글일 경우) 가 되어야 하는데, 실제 어떤 컴퓨터에서는 strTmp = "1969? 12?31? ??? ?? 7:00:00"<BR> 또 다른 컴퓨터에서는<BR> strTmp = "1969³â 12¿ù 31ÀÏ ¼ö¿äÀÏ ¿ÀÈÄ 7:00:00"<BR> 이렇게 나오거든요.<BR> <BR> 그래서 결국은 제가 아래와 같이 바꿨습니다.<BR> <BR> CTime time(0);<BR> <BR> SYSTEMTIME tm;<BR> time.GetAsSystemTime(tm);<BR> _TCHAR szDate[100], szTime [100];<BR> GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &tm, NULL, szDate, sizeof( szDate )/sizeof( _TCHAR )); GetTimeFormat( LOCALE_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &tm, NULL, szTime, sizeof( szTime )/sizeof( _TCHAR )); CString strDateTime = (CString)szDate + _T(" ") + (CString) szTime;<BR> <BR> 보시다시피, 깨끗해보였던 코드가 아주 지저분해졌답니다.<BR> 일단은 제가 팀원들한테 VC 버그라고했는데, 과연 VC버그인지 혹은 제가 무지해서 그런지 알고싶어서 연락드리는 바입니다.<BR> <BR> 감사합니다.<BR> </DIV> </FONT>
첨부파일
스팸 방지용 인증 번호
1667
(왼쪽의 숫자를 입력해야 합니다.)