0

MacOSのRoman文字列をUTF8文字列に変換しようとしています。

MacRoman: OneBW/1 Schwarzwei§:

私はこれらの呼び出しを使用しています:

nBufLen = MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, NULL, 0);

MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, tempWchar, nBufLen);

この時点で:

tempWhar = OneBW/1 Schwarzweiß:

今、私はこの電話をかけています:

WideCharToMultiByte(CP_UTF8, 0, tempWchar, -1, temp, nBufLen, NULL, NULL);

tempUTF 8に含まれることを期待していますが0、戻り値が返されます。これは、変換に失敗し、文字列が含まれていtempます。temp文字列がUTFにあることをどのように知ることができますか?

私はそれを正しい方法でやっていますか、それとも何かが欠けていますか?ありがとう。

4

2 に答える 2

1

WideCharToMultiByte入力から単一のワイド文字を取得し、出力で複数の文字に変換します。したがって、ほとんどの場合、出力は入力よりも大きくなります。取得したのと同じバッファーサイズを渡しているMultiByteToWideCharため、当然バッファーが小さすぎます。

の場合と同じ方法で必要なバッファ サイズを取得できますMultiByteToWideChar。バッファ サイズに 0 を渡し、戻り値を使用します。

関数が失敗したときに文字列の末尾にガベージが表示されるのは、バッファに必要な終端の null 文字を入れる余地がなかったためです。文字列の出力は、バッファの最後から実行されます。

于 2012-09-27T21:48:11.693 に答える
0

他の人が述べているように、出力バッファが小さすぎます。代わりに次のようにしてみてください。

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...
    }
}
于 2012-09-27T22:06:07.580 に答える