Próbuję przekonwertować ciąg znaków Mac OS Roman na ciąg UTF8:
MacRoman: OneBW/1 Schwarzwei§:
Używam tych połączeń:
nBufLen = MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, NULL, 0);
MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, tempWchar, nBufLen);
W tym momencie:
tempWhar = OneBW/1 Schwarzweiß:
Teraz dzwonię:
WideCharToMultiByte(CP_UTF8, 0, tempWchar, -1, temp, nBufLen, NULL, NULL);
Spodziewam się, że temp
będzie w UTF 8, ale otrzymuję zwracaną wartość 0
, co oznacza nieudaną translację, coś w postaci ciągu w temp
. Skąd mam wiedzieć, że ciąg znaków w temp
jest w UTF?
Czy robię to we właściwy sposób, czy czegoś brakuje? Dziękuję.
2 odpowiedzi
WideCharToMultiByte
pobierze pojedyncze szerokie znaki z danych wejściowych i przekonwertuje je na wiele znaków w danych wyjściowych. Tak więc w większości przypadków wyjście będzie większe niż wejście. Przekazujesz ten sam rozmiar bufora, który uzyskałeś z MultiByteToWideChar
, więc naturalnie bufor jest za mały.
Możesz uzyskać wymagany rozmiar bufora w taki sam sposób, jak dla MultiByteToWideChar
, przekazując 0 jako rozmiar bufora i używając zwróconej wartości.
Powodem, dla którego widzisz śmieci na końcu ciągu, gdy funkcja kończy się niepowodzeniem, jest to, że w buforze nie było miejsca na niezbędny kończący znak null. Drukowanie łańcucha kończy się na końcu bufora.
Jak powiedzieli inni, twój bufor wyjściowy jest za mały. Zamiast tego wypróbuj coś takiego:
int nBufLen = MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), macRomanString.length(), NULL, 0);
if (nBufLen != 0)
{
std::vector<WCHAR> tempWchar(nBufLen, 0);
MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), macRomanString.length(), &tempWchar[0], nBufLen);
nBufLen = WideCharToMultiByte(CP_UTF8, 0, &tempWchar[0], tempWchar.size(), NULL, 0, NULL, NULL);
if (nBufLen != 0)
{
std::vector<CHAR> tempUchar(nBufLen, 0);
WideCharToMultiByte(CP_UTF8, 0, &tempWchar[0], tempWchar.size(), &tempUchar[0], nBufLen, NULL, NULL);
// use tempUChar as needed...
}
}
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .