C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57018] Re:[C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상
한빈짱 [hanbinjjang1] 2064 읽음    2009-05-28 14:49
버그인지 원래 그런건지 모르겠지만

sMain.t_str()를 호출하는 순간

sMain의 데이타가 AnsiString 형태로 바뀌네요.

UnicodeString sMain="12345"; 실행시

String의 private 변수인 wchar_t *Data;가 가리키는 곳은

31 00 32 00 33 00 34 00 35 00 00 00 와 같이 저장되어 있는데,

char *p = sMain.t_str();을 호출하면

Data가 다른 곳을 가리키게 되고, 그곳에는

31 32 33 34 35 00 이라고 저장되어있다.

그래서 strcpy로 buff에는 31 00 32 00 33 00... 이 복사되지 않고 31 32 33 34 35 00 이 복사된다.

하지만,

sMain은 여전히 UnicodeString이고, Data는 wchar_t * 이므로,
Data[0] = 0x 32 31
Data[1] = 0x 34 33
Data[2] = 0x 00 35
Data[3] = 0x 00 00

로 읽게 되어

SubString(1,2)를 호출할경우
해당 코드페이지의 0x3231, 0x3433의 값이 출력된다.


추가로 UnicodeString str = "한"(0xD55C); 과 같이 2바이트 문자를 넣고,

str.t_str()을 호출하면 "퇇"(0xD1C7)로 바뀐다.

0xD1C7 은 메모리에 C7 D1 00 ... 으로 써있으며,

char p[] = {0xC7, 0xD1,}  p를 출력하면 "한"으로 출력된다.

언젠가 써본 WideCharToMultiByte()를 사용하여 변환하는 듯하다.





결론은 이렇다.

UnicodeString은 저장된 데이타를 wchar_t *Data로 가리키고 있는데,

t_str()을 호출하면 Data의 데이타를

WideCharToMultiByte()함수를 사용하여,

MultiByte로 바꾼다.

그리고 변환된 데이타를 Data가 가리키게 된다.

Data가 가리키는 더이상 widechar이 아니므로

SubString과 같은 함수는 제대로된 값을 반환할 수 없다.

메모리 할당,해제는 잘 모름;;

분석~ 끝!@







최낙구 님이 쓰신 글 :
: C++ Builder 2009에서
: strcpy후에 글자 SubString하면 깨짐현상이 있읍니다.
: (그림참조)
:
: 소스
:
:   String sMain="12345";
:   char buff[255];
:   Memo2->Lines->Add(sMain);
:   Memo2->Lines->Add(sMain.SubString(1,2));
:   strcpy(&buff[0],sMain.t_str());
:   Memo2->Lines->Add(sMain);
:   Memo2->Lines->Add(sMain.SubString(1,2));
:
: 결과
:
: 12345
: 12
: 12345
: 㐳㐳

+ -

관련 글 리스트
56884 [C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상 최낙구 1274 2009/05/17
57018     Re:[C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상 한빈짱 2064 2009/05/28
56897     Re:[C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상 김태선 1970 2009/05/18
56892     Re:[C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상 땅주인 1557 2009/05/18
56888     Re:[C++ Builder 2009][버그?]strcpy후에 SubString하면 글자 깨짐현상 시녕tm 1608 2009/05/18
56890         Re:Re:[C++ Builder 2009][버그?]t_str Method를 사용후에 SubString하면 글자 깨짐현상 최낙구 1291 2009/05/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.