Так и widechartomultibyte() и wcstombs за()

в чем разница между WideCharToMultiByte() и wcstombs() Когда использовать какой?

5 ответов


в двух словах:WideCharToMultiByte функция предоставляет кодировки / кодовые страницы, используемые для преобразования в списке параметров, в то время как wcstombs нет. Это крупная Пита, как стандартная не определяет какая кодировка должна использоваться для создания wchar_t, в то время как вам как разработчику, безусловно, нужно знать, какую кодировку вы конвертируете в/из.

кроме того, WideCharToMultiByte, конечно, является функцией Windows API и не доступен на любом другом платформа.

поэтому я бы предложил использовать WideCharToMultiByte без минутной мысли, если ваше приложение специально не написано, чтобы быть портативным для ОС, отличных от Windows. В противном случае, вы можете захотеть бороться с wcstombs или (предпочтительно IMHO) посмотрите на использование полнофункциональной портативной библиотеки Unicode, такой как ОИТ.


  • WideCharToMultiByte-это функция Windows API, которая преобразует между определенными Windows многобайтовыми кодовыми страницами, хранящимися в CHAR, и UTF16, хранящимися в WCHAR. Кодовая страница для использования передается в качестве первого параметра и может быть передана как CP_ACP, что означает кодовую страницу, специфичную для текущей локали системы, установленной в инструменте локализации панели управления "язык для использования для программ, отличных от Unicode". Он доступен #including и доступен только на Окна.

  • wcstombs-это стандартная функция времени выполнения C, которая преобразует между текущей кодировкой char* c-runtimes и кодировкой wchar_t*. в разделе setlocale МСИО может использоваться, чтобы установить кодовую страницу(ы) для использования.

  • std:: codecvt-это класс шаблона стандартной библиотеки C++, используемый для преобразования строк между различными кодировками с использованием различных признаков типа mechanisims для определения источника и назначения кодирования.

есть другие библиотеки, включая ICONV или ICU, которые также выполняют различные многобайтовые преобразования unicode.


как и с любой другой функцией: использовать функцию, которая делает то, что вам нужно в вашей программе.

WideCharToMultiByte преобразует из UTF-16 (используется как представление Win32 WCHAR) в Win32 кодовую страницу по вашему выбору.

wcstombs преобразует из реализации, определенной внутренней wchar_t представление для текущего определенного реализацией внутреннего многобайтового представления.

Итак, если ваша программа является родной программой Win32, которая использует множество функций WIN32 API, которые используют и верните строки WCHAR, тогда вам нужно WideCharToMultiByte. Если вы пишете некоторые функции на основе стандартной библиотеки (не Win32 API), которые работают со стандартными строками C wchar_t, вам нужно wcstombs.


основное отличие в том, что wcstombs является стандартной функцией, поэтому используйте ее, если код должен работать на любой платформе, кроме Windows.


wcstombs() является портативным, тогда как WideCharToMultiByte() функция только win32.

когда дело доходит до этого,wcstombs() вызывает системную функцию, которая на Win32, скорее всего, будет прямым вызовом WideCharToMultiByte() - однако он может полностью обойти эту функцию и просто перейти прямо к внутренним.
В любом случае практической разницы нет.