codememo

char *를 LPWSTR로 변환

tipmemo 2023. 7. 17. 21:07
반응형

char *를 LPWSTR로 변환

멀티바이트 문자 프로그램을 유니코드로 변환하려고 합니다.

저는 그 프로그램을 거쳤고, 문자열 리터럴보다 앞섰습니다.L그래서 그들은.L"string".

이것은 효과가 있었지만, 저는 현재 적합하지 않은 C 스타일 스트링을 가지고 있습니다.나는 그것을 시도해 보았습니다.L그리고 그것을 넣는 것.TEXT()그러나L사용할 경우 문자열이 아닌 변수 이름에 추가됩니다.TEXT().

나는 그것을 만들기 위해 노력했습니다.TCHAR하지만 그러면 변환할 수 없다고 불평합니다.TCHAR아주char *.

제게 남은 선택지는 무엇입니까?

저는 C와 C++이 다르다는 것을 알고 있습니다.몇 년 전부터 C++ 프로젝트에 사용되어 온 오래된 사내 C 라이브러리입니다.

원하는 기능은 다음과 같습니다.

 char text[] = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text, strlen(text)+1);//Plus null
 LPWSTR ptr = wtext;

위해서strings,

 string text = "something";
 wchar_t wtext[20];
 mbstowcs(wtext, text.c_str(), text.length());//includes null
 LPWSTR ptr = wtext;

--> ED: "L" 접두사는 문자열 리터럴에서만 작동하고 변수에서는 작동하지 않습니다.<--

깔끔한 사용법mbstowcs두 번 호출하여 결과의 길이를 찾는 것입니다.

  const char * cs = <your input char*>
  size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);

  // error if wn == size_t(-1)

  wchar_t * buf = new wchar_t[wn + 1]();  // value-initialize to 0 (see below)

  wn = mbsrtowcs(buf, &cs, wn + 1, NULL);

  // error if wn == size_t(-1)

  assert(cs == NULL); // successful conversion

  // result now in buf, return e.g. as std::wstring

  delete[] buf;

전화하는 것을 잊지 마세요.setlocale(LC_CTYPE, "");당신의 프로그램의 시작에!

Windows에 대한 이점MultiByteToWideCharWindows에서는 어쨌든 Windows API 기능을 선호할 수 있지만 이 기능은 완전히 표준 C입니다.

나는 보통 이 방법을 반대의 방법과 함께 두 개의 변환 함수로 포장합니다.string->wstring그리고.wstring->string사소한 오버로드도 추가하는 경우string->string그리고.wstring->wstringWinapi와 컴파일되는 코드를 쉽게 작성할 수 있습니다.TCHAR모든 설정에서 def를 입력합니다.

[편집:] 제로 초기화를 추가했습니다.bufC 배열을 직접 사용하려는 경우.저는 보통 결과를 다음과 같이 반환합니다.std::wstring(buf, wn)하지만 C 스타일의 널 종단 배열을 사용할 계획이라면 주의해야 합니다.[/]

멀티스레드 환경에서는 스레드-로컬 변환 상태를 함수의 최종(현재 보이지 않는) 매개 변수로 전달해야 합니다.

여기 이 주제에 대한 나의 작은 고함소리가 있습니다.

저는 VC++에서 다음을 사용하고 있으며 저에게는 매력적으로 작동합니다.

CA2CT(charText)

Windows API 기능을 사용하는 이 버전MultiByteToWideChar()임의로 긴 입력 문자열에 대한 메모리 할당을 처리합니다.

int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW>0)
{
    output = new wchar_t[lenW];
    ::MultiByteToWideChar(CP_ACP, 0, input, lenA, output, lenW);
} 

사용할 수 있습니다.CString,CStringA,CStringW자동 변환을 수행하고 이러한 유형 간에 변환합니다.또한 다음을 사용할 수도 있습니다.CStrBuf,CStrBufA,CStrBufWRAII 패턴 수정 가능 문자열을 가져옵니다.

언급URL : https://stackoverflow.com/questions/6858524/convert-char-to-lpwstr

반응형