질문 님이 쓰신 글 :
: 계측기에 값을 수신해서 소숫점 3자리까지 자르고 뒤에 스트링을 붙였는데요..
:
: 이상하게 Ω 옴 이란 글자 그대로 붙이니 뒤에 ? 물음표 같은게 꼭 붙더라구요
:
:
: AnsiString tmp_String="";
: double tmp_d=0.023452;
: tmp_String=tmp_String.sprintf("%.3f -OK mΩ ",tmp_d);
:
:
: 위의 코드처럼 작성했는데 tmp_String 값을 보면 0.023 -OK mΩ ? 소숫점이랑 문자는 잘 달리는데 꼭 ? 이런게 붙네요
:
: 저걸 안나오게 하는법 아시는분 알려주시면 감사하겠습니다.
:
:
답변:
C++빌더에서 AnsiString은 AnsiStringT<0> 인 템플릿으로 정의되고
여기서 템플릿 인수 0은 현재 OS의 디폴트 코드페이지를 사용해서 Encoding 한다는 것을 의미 합니다.
한글 Windows OS를 사용한다면 OS 디폴트 코드페이지는 CP 949 이고
CP 949 에서 128 이상의 두 바이트 문자 셋은 KS X 1001 에 배당되어 사용되는데
Ω 도 특수문자로 포함되어 있습니다. 원문자, 괘선문자, 그리스 문자, 히라가나, 가타카나 등을 포함해서
AnsiString 타입에 대해서 뒤에 이상한 물음표가 붙어서 보이는 것은 문자셋의 문제가 아니고
IDE의 Visualizer 가 문자표시를 잘못하는 버그를 갖고있어서 입니다.
AnsiString의 템플릿 클래스 멤버인 Data를 인스펙트 해보면 정상 적으로 보일 겁니다.
CP 949 코드페이지가 사용되는 경우..
char buf[1024];
sprintf(buf,"%.3f -OK mΩ ",tmp_d);
와 같이 char [] 타입인 경우에 대해서는 Viualizer 가 문자표시를 정상적으로 하는 상황이라면
AnsiString 타입에 대한 Visualizer를 구현 할 때, char [] 또는 char * 타입을 문자표시하는 코드를
재사용해서 AnsiStringT의 멤버인 char* Data에 적용하도록 Visualizer를 구현했으면 간단한 건데 닭짓을 해놓은 거죠.
IDE Visualizer 버그이니
AnsiString as;
...
UnicodeString us(as);
해서 사용해도 됩니다.
엠바 IDE가 버그가 많아요. 아마추어가 대충 만들어 놓은 것 처럼...
엠바 애들이 코드를 아마추어 처럼 단무지 같이 구현해 놓은 경우는 다른 예에서도 찾아 볼 수 있는데
파스칼 유닛이 패키지 형식으로 빌드되면, 파스칼 언어의 특성상 Initialization 섹션이 런타임 중에
초기화 될 때, 유닛이 사용되는 순서에 종속성을 가지는 파스칼 랭귀지의 구조적인 문제로 인해서...
패키지가 다른 패키지들을 참조해서 사용할 경우, 패키지들 간의 물고 물리는 Initialization Dependency 관계를 체크해야 하는데
지금 까지 엠바 애들이 구현했던 방식은 TStringList를 이용해서 n by n 의 로드/언로드를 통한 단무지 같은 방식으로
코드를 구현해서...
IDE가 처음 시작할 때.. 그 수 많은 패키지의 Initialization Dependency를 체크하느라 IDE 로딩 시간을 엄청
잡아 먹었었지요. 느려터진 IDE 로드 지연의 주범. 최근에 와서는 TStringList를 사용하지 않고 Hash map 으로 바꾸어 구현해서
IDE 로딩 시간이 줄어 들기는 했지만...
링커도 무식하게 구현해 놓은 부분이 있는데, 이건 생략 합니다.
|