Как правильно использовать WideCharToMultiByte

Как правильно использовать WideCharToMultiByte

Я прочитал документацию здесь:

http://msdn.microsoft.com/en-us/library/ms776420 (VS.85). ASPX

Я застрял на этом параметре:

lpMultiByteStr

[Out] Указатель на буфер, который получает преобразованную строку.

Я не совсем уверены, как правильно инициализировать переменную и кормить его в функцию

Answer: 216879

@ Брайан Р. Бонди: Вот пример, который показывает, почему вы не можете просто размера буфера вывода на количество широких символов в строке источника:

#include <windows.h>

#include <stdio.h>

#include <wchar.h>

#include <string.h>

/* string consisting of several Asian characters */

wchar_t wcsString[] = L"\u9580\u961c\u9640\u963f\u963b\u9644";

int main()

{

size_t wcsChars = wcslen( wcsString);

size_t sizeRequired = WideCharToMultiByte( 950, 0, wcsString, -1,

NULL, 0, NULL, NULL);

printf( "Wide chars in wcsString: %u\n", wcsChars);

printf( "Bytes required for CP950 encoding (excluding NUL terminator): %u\n",

sizeRequired-1);

sizeRequired = WideCharToMultiByte( CP_UTF8, 0, wcsString, -1,

NULL, 0, NULL, NULL);

printf( "Bytes required for UTF8 encoding (excluding NUL terminator): %u\n",

sizeRequired-1);

}

И вывод:

Wide chars in wcsString: 6

Bytes required for CP950 encoding (excluding NUL terminator): 12

Bytes required for UTF8 encoding (excluding NUL terminator): 18

Answer: 215973

Вы используете lpMultiByteStr [Out] параметр путем создания новых массивов символ. Затем пройти этот массив символов, чтобы получить его заполнить. Вам только необходимо инициализировать Длина строки + 1, так что вы можете иметь нулевую строку прекращены после преобразования.

Вот пара полезных функций помощником для вас, они демонстрируют использование всех параметров.

#include <string>

std::string wstrtostr(const std::wstring &wstr)

{

// Convert a Unicode string to an ASCII string

std::string strTo;

char *szTo = new char[wstr.length() + 1];

szTo[wstr.size()] = '\0';

WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, szTo, (int)wstr.length(), NULL, NULL);

strTo = szTo;

delete[] szTo;

return strTo;

}

std::wstring strtowstr(const std::string &str)

{

// Convert an ASCII string to a Unicode String

std::wstring wstrTo;

wchar_t *wszTo = new wchar_t[str.length() + 1];

wszTo[str.size()] = L'\0';

MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo, (int)str.length());

wstrTo = wszTo;

delete[] wszTo;

return wstrTo;

}

--

В любое время в документации, когда вы увидите, что оно имеет параметр, который является указателем на тип, и они скажут вам это из переменной, вы хотите создать этот тип, а затем передать указатель на него. Функция будет использовать этот указатель для заполнения переменной.

Таким образом, вы можете понять это лучше:

//pX is an out parameter, it fills your variable with 10.

void fillXWith10(int *pX)

{

*pX = 10;

}

int main(int argc, char ** argv)

{

int X;

fillXWith10(&X);

return 0;

}

http://ru.w3support.net/index.php?db=so&id=215963