|
버그인지 원래 그런건지 모르겠지만
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
: 㐳㐳
|