2012-10-18 3 views
2

이 질문에 많은 질문이 제기되지만이 작업을 수행 할 수있는 방법이 있는지 확인하고 싶습니다.C 문자열에서 넓은 C 문자열

기본적으로 나는 null로 끝나는 C 문자열을 가리키는 const char *가 있습니다. 동일한 문자가있는 문자열을 가리키는 const wchar_t *를 기대하는 또 다른 함수가 있습니다. 당분간

, 나는 이런 식으로 일을하려고 한 : 내가 기대하는 제 3의 라이브러리를 처리하고있어 이후

size_t newsize = strlen(myCString) + 1; 
    wchar_t * wcstring = new wchar_t[newsize]; 
    size_t convertedChars = 0; 

    mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE); 

    delete[] wcstring; 

내가 많은 장소에서 이러한 변환을해야 하나 다른 하나. 이것에 대해 권장되는 방법입니까?

+4

을 그것은 강하게'const를 문자 *'문자열 (UTF-8이 될 수 ISO-라틴 1, KOI의 가정 인코딩에 따라 달라집니다 -8, ...). 인코딩을 알아야합니다. http://www.gnu.org/software/libiconv/ library에 관심을 가질 수 있습니다. –

+0

당신은 본질적으로 올바른 길을 가고 있습니다. 먼저 널 포인터로'mbstowcs'를 실행하여 올바른 타겟 크기를 얻을 수 있습니다. 프로그램 시작시'std :: setlocale ("");을 실행하는 것을 잊지 마십시오. –

답변

2

데이터가 모두 ASCII 인 것으로 가정 할 때 수행하는 작업이 좋습니다. 거기에 ASCII가 아닌 데이터가 있다면 UTF-8, Windows-1252, ISO 8859 변형, SHIFT-JIS 등 인코딩이 무엇인지 알아야합니다. 각각 다른 방식으로 변환해야합니다 .

내가 바꿀 유일한 것은 mbstowcs_s 대신 mbstowcs을 사용하는 것입니다. mbstowcs_s은 Windows에서만 사용할 수 있으며 mbstowcs은 이식 가능한 표준 C99 기능입니다. 물론 Microsoft 컴파일러에서 CRT 사용 중단 경고를 피하고 싶지 않은 경우 #if 테스트 매크로를 사용하여 Windows가 아닌 시스템에서는 mbstowcs을 사용하고 Windows 시스템에서는 mbstowcs_s을 사용하는 것이 좋습니다.

mbstowcs을 사용하여 먼저 대상에 대해 NULL을 전달하여 변환 된 문자열의 길이를 가져올 수 있습니다. 그렇게하면 입력 문자열의 길이에 관계없이 잘림을 피할 수 있습니다. 그러나 문자열을 두 번 변환하는 작업이 필요합니다.

비 ASCII 변환의 경우 libiconv을 사용하는 것이 좋습니다.

+1

사실 그것은 ASCII에서 변환하지 않습니다 - 현재 로케일의 LC_CTYPE이 암시하는 형식 (ASCII 또는 UTF-8 등)으로 변환됩니다. –

+0

또한 mbsrtowcs (3)을 보길 원할 것입니다. mbsrtowcs (3)은 상태 변수를 전달할 때 스레드로부터 안전합니다. "더 안전한"인터페이스가 있으며 Windows 및 Linux에서 사용할 수 있습니다. – rholmes

0

인코딩과 관련된 내용이 없습니다. 가 아닌 멀티 바이트 문자열이있는 경우, 당신은이를 사용할 수 있습니다

std::string a("hello"); 
std::wstring b(s.begin(), s.end()); 

const wchar_t *wcString= b.c_str();