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ę.

0
sam 28 wrzesień 2012, 00:55

2 odpowiedzi

Najlepsza odpowiedź

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.

1
Mark Ransom 28 wrzesień 2012, 01:48

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...
    }
}
0
Remy Lebeau 28 wrzesień 2012, 02:06