2011-09-03 2 views
1

나는 코드 :: 블록 10.05 레브 0 및 gcc 4.5.2 리눅스/유니 코드 64 비트 및 WxWidgets 버전 2.8.12.0-0
나는 간단한 문제가있다 :Cx + wxWidgets, 유니 코드 대 ASCII, 차이점은 무엇입니까?

#define _TT(x) wxT(x) 
string file_procstatus; 
file_procstatus.assign("/PATH/TO/FILE"); 
printf("%s",file_procstatus.c_str()); 
wxLogVerbose(_TT("%s"),file_procstatus.c_str()); 

Printf 출력 "/ PATH/TO/FILE "인 반면 wxLogVerbose는 쓰레기로 변합니다. std :: string을 wxString으로 변경하려면 다음을 수행해야합니다.

wxString buf; 
buf = wxString::From8BitData(file_procstatus.c_str()); 

누군가가 잘못된 생각 일 수 있습니다. 왜 8 비트 데이터에서 변경해야합니까?

답변

4

이것은 문자 데이터가 메모리에 저장되는 방법과 관련이 있습니다. "문자열"을 사용하면 ASCII 문자 집합을 사용하여 char 문자열을 생성합니다. _TT 매크로는 유니 코드 문자 집합 (Linux I의 UTF-32)을 사용하여 wchar_t 문자열을 만드는 L "문자열"로 확장됩니다 믿다).

printf 기능 내가 wchar_t 문자열을 기대하고 가정 wxLogVerbose 반면 char 문자열을 기대하고있다. 이것이 전환의 필요성이 나오는 곳입니다. ASCII는 한 문자 (8 비트 데이터) 당 1 바이트를 사용하지만 wchar_t 문자열은 문자 당 여러 바이트를 사용하므로 문제는 문자 인코딩에 미치지 않습니다. 다음 문서들이 저장되는 방법을 유니 코드의 차이 ASCII 문자 세트에 대한 가장 최선의 방법으로 설명을 제공

wstring file_procstatus = wxT("/PATH/TO/FILE"); 
wxLogVerbose(_TT("%s"),file_procstatus.c_str()); 
+0

사용 wsString는 표준의 insted .. 그리고 항상 _TT를 사용하여 문자열이 해결책이 될 수도 있지만, 내가 모든 것을 변환해야 OS 기능 (너무 STL 함수)를 사용할 때 다음 문제가 온다 (별칭을 for wxT)는 꽤 짜증납니다. 그래서 아마 std :: string을 wxString으로 변환해야합니다. :) – ptrl4me

+0

@ ptrl4me : wxString은 STL 함수에서 OK 여야한다고 생각합니다. 그리고 그것은'std :: string'이 OS 기능과 함께 더 이상 편리하지 않은 것처럼 보입니다. – UncleBens

0

:이 변환 함수를 호출하고 싶지 않은 경우

는 다음과 같은 일을 할 문자열 함수가 어떻게 작동하는지에 대한 정보를 제공합니다.

http://allaboutcharactersets.blogspot.in/

+0

이 기사는이 질문에 대한 다른 대답보다 무엇을 더 많이 말합니까? –

관련 문제