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
'codememo' 카테고리의 다른 글
| Oracle SQL에서 상위 행의 모든 재귀 자식을 검색하는 방법은 무엇입니까? (0) | 2023.07.17 |
|---|---|
| argv의 인코딩은 무엇입니까? (0) | 2023.07.17 |
| 유형 스크립트와 함께 뷰에서 Mixins를 사용할 수 없습니다. (0) | 2023.07.13 |
| 기본값이 아닌 인수는 기본값 인수를 따를 수 없는 이유는 무엇입니까? (0) | 2023.07.13 |
| Visual Studio 코드가 설치된 Git를 감지할 수 없습니다. (0) | 2023.07.13 |